模拟链调用涉及Java中的Stream

时间:2018-08-08 12:19:06

标签: java junit java-8 mockito powermock

如何模拟流中的链接调用。还要注意,它正在将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());

1 个答案:

答案 0 :(得分:3)

你没有。

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

换句话说,您的测试从本质上应该看起来像:

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

嘲笑容器(例如列表或地图)是(几乎总是)错误的。

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

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

您始终希望拥有依赖于模拟的测试。当谈论列表时,然后嘿:用准备好的输入填充列表,而不是模拟列表。