是否有任何模拟框架可以对聚合中的每个 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/