【问题标题】: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();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2019-01-08
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多