【问题标题】:Mocking of aggregates with any Java mocking framework使用任何 Java 模拟框架模拟聚合
【发布时间】:2012-11-27 07:23:53
【问题描述】:
是否有任何模拟框架可以对聚合中的每个孩子进行“完整”模拟?例如。
final Report report = createMock(Report.class);
expect(report.getReportSides().get(0).getSideGroup().get(1)).andStubReturn(createSomething());
我希望在我不必做任何其他事情的情况下模拟带有这些索引的调用,并且在我开始编写大量测试代码之前......这在任何框架中是否可行,EasyMock、PowerMock、Mockito 等?
(类示例是从客户 XML 自动生成的遗留类,因此类结构怪异,并且没有域服务层)。
【问题讨论】:
标签:
java
testing
mockito
easymock
powermock
【解决方案1】:
我相信您知道强烈建议不要模拟值,但是对于遗留的东西可能会有时髦的东西。
无论如何,下面的声明可能会起到很大的作用:
mock(Report.class, RETURNS_DEEP_STUBS)
但是,您似乎在聚合 report.getReportSides().get(0).getSideGroup().get(1) 中有集合,并且由于类型泛型擦除 Mockito 或其他框架无法推断集合中应包含的运行时类型,因此 RETURNS_DEEP_STUBS 答案将创建一个与返回匹配的模拟通过反射读取的类型,并且在 java 集合的情况下肯定是 Object 本身的模拟。所以你必须手动处理它。
附带说明,mockito 主干中的泛型类型已经取得了进展,它可以检索嵌入在类中的更多泛型信息,它显然不靠近任何具有运行时自省的东西(在当前版本的 Java 中是不可能的)但是它越来越接近它。
使用升级后的RETURNS_DEEP_STUBS,您可以:
public interface A<K extends MyKeyType> extends Map<K, MyValueType> {}
deepStubMock.entrySet().iterator().next()
.getValue().someValueTypeMethod().eventuallyFollowedByAnotherMethod();
编辑:看起来大卫在评论中回答了我之前 :)