java - 使用任何 Java 模拟框架模拟聚合

标签 java testing mockito easymock powermock

是否有任何模拟框架可以对聚合中的每个 child 进行“完整”模拟?例如。

final Report report = createMock(Report.class);
expect(report.getReportSides().get(0).getSideGroup().get(1)).andStubReturn(createSomething());

我希望无需执行任何其他操作即可模拟使用这些索引的调用,并且在我开始编写一些大量测试代码之前......这在任何框架、EasyMock、PowerMock、Mockito 等中都可能吗?

(类示例是从客户 XML 自动生成的遗留类,因此类结构很奇怪,并且没有域服务层)。

最佳答案

我相信您知道强烈建议不要模拟值,但对于遗留的东西,可能会有一些时髦的东西。

无论如何,以下声明可能会完成大部分工作:

mock(Report.class, RETURNS_DEEP_STUBS)

但是您似乎在聚合 report.getReportSides().get(0).getSideGroup().get(1) 中有集合,并且由于类型泛型删除 Mockito 或其他框架无法推断应该在集合中的运行时类型,因此 RETURNS_DEEP_STUBS 答案将创建一个匹配通过反射读取的返回类型的模拟,并且肯定是 Object 的模拟本身在 java 集合的情况下。所以你必须手动处理它。

作为旁注,mockito 主干中的泛型类型已经取得了进展,它可以检索更多嵌入到类中的泛型信息,它显然不接近任何具有运行时自省(introspection)的东西(对于当前版本的 Java 是不可能的)但是它越来越接近它。 使用升级后的 RETURNS_DEEP_STUBS,您可以:

public interface A<K extends MyKeyType> extends Map<K, MyValueType> {}

deepStubMock.entrySet().iterator().next()
    .getValue().someValueTypeMethod().eventuallyFollowedByAnotherMethod();

编辑:看起来 David 在评论中先于我回答了 :)

关于java - 使用任何 Java 模拟框架模拟聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13579269/

相关文章:

java - 为什么在 Constructor 和 Setters 中使用 "this"关键字?

c# - Selenium-WebDriver 打开了新的 Firefox 窗口,但没有导航到 URL

java - Hystrix 仪表板始终显示加载屏幕

java - 使用java将Ms word表格的单元格转换为图像

ios - ECSlidingViewController 和测试

java - 使用 Mockito 模拟内部方法

java - 在私有(private)方法内编写 switch 语句的测试用例

java - 简单的 Mockito 验证在 JUnit 中有效但在 Spock 中无效

java - 有人可以解释一下 System.nanoTime() 的描述吗?

testing - 在 Linux 中使用 HtmlUnitDriver 和使用 Xvfb 编写 headless 测试有什么区别?