我应该模拟流操作的列表吗?

Nav*_*ngh 0 java unit-testing junit4 mockito

我在函数中有一行代码,它对 as 应用流操作ArrayList

List<Entity> list = xyz(); 

long result = list.stream().map(n -> n.getData()).filter(n -> n == 1).count();
Run Code Online (Sandbox Code Playgroud)

现在,当我为此方法编写测试时,我应该这样做:

@Mock
private List<Entity> list;

//inside the test method
when(list.stream().map(any()).filter(any()).count()).thenReturn(someValue);
Run Code Online (Sandbox Code Playgroud)

我想到的是,当我们在代码中调用流操作时,我们基本上是走出类来调用这些函数。由于这是单元测试,我们应该留在我们的模块内。如果我有一些误解,请澄清。如果我们不需要嘲笑List,那为什么呢?

Mic*_*ael 5

可以嘲笑这个列表,但这可能比它的价值更麻烦。列表和流接口非常大,如果不模拟每个方法(不用了,谢谢)或仅模拟您使用的方法,就很难模拟它们,这意味着您将依赖于了解您所使用的方法的内部实现细节重新测试。后者会导致脆弱的测试。最好编写一个不关心实现细节,只关心输入和输出的测试。

当创建对象的正确版本非常困难时,或者当您想要为测试提供隔离时,应该使用模拟。创建列表并不难,而且它们经过了充分的测试,以至于模拟它们并不能真正为增加隔离性提供任何价值。

只需正常创建一个列表即可。

list = Arrays.asList(new Entity(1), new Entity(2), new Entity(1));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以断言该方法的结果为 2。

你可能会从嘲笑实体中得到一些好处,但是例如

Mockito.when(Entity.getData()).thenReturn(1);
Run Code Online (Sandbox Code Playgroud)