1

是否有任何模拟框架可以对每个孩子进行“全面”模拟?例如。

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

我希望在我不必做任何其他事情的情况下模拟带有这些索引的调用,并且在我开始编写大量测试代码之前......这在任何框架中是否可行,EasyMock、PowerMock、Mockito 等?

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

4

1 回答 1

2

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

无论如何,以下声明可能会起到很大的作用:

mock(Report.class, RETURNS_DEEP_STUBS)

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

附带说明一下,mockito 主干中的泛型类型已经取得了进展,它可以检索嵌入在类中的更多泛型信息,它显然不接近任何具有运行时自省的东西(对于当前版本的 Java 是不可能的),但它更接近给它。升级后RETURNS_DEEP_STUBS,您可以执行以下操作:

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

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

编辑:看起来大卫在评论中回答了我之前的问题:)

于 2012-11-27T10:34:25.643 回答