【问题标题】:Mock chain calls involves Stream in JavaMock链调用涉及Java中的Stream
【发布时间】:2018-08-08 12:19:05
【问题描述】:

如何使用流模拟链式调用,。另请注意,它调用 each.getName() 作为中间操作。 我无法创建 SomeCountobject 所以也必须模拟它。

Set<String> obj = new HashSet<String>();
List<SomeCount> someGroups = Some_Mocked_Implementation();
obj = someGroups.stream().map(each -> each.getName()).filter(each -> 
                          userNames.indexOf(each) == -1)
                         .collect(Collectors.toSet());

【问题讨论】:

    标签: java junit java-8 mockito powermock


    【解决方案1】:

    你没有。

    这只是经典的“输入/输出”测试。您只需创建一个包含特定对象的 输入 列表,以便您可以预测该操作会产生什么。

    换句话说,您的测试本质上应该如下所示:

    assertThat(someMethodDoingTheStreamOperation(yourInputList), is(expectedResult));
    

    模拟 容器,例如 List 或 Map 是(几乎总是)错误的。

    如果您仍然坚持这样做,您可以使用 Mockito 及其 deep stubs 支持。

    但同样:这意味着您开始将解决方案的实施细节放入您的测试代码中。这意味着您的测试代码只不过是生产代码的“副本”。第二次更改生产代码,您的单元测试可能会中断。因此,即使是简单的重构也可能成为问题。

    您总是更喜欢依赖模拟的测试。当谈到列表时,嘿:用准备好的输入填充列表,而不是模拟列表。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2012-12-29
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多