模拟一种返回Stream且被多次调用的方法

时间:2019-02-11 15:35:42

标签: java unit-testing junit mocking mockito

MyStreamClass mock = mock(MyStreamClass.class);

when(mock.streamMethod()).thenReturn(Stream.of("A", "B"));

System.out.println(""+mock.streamMethod().findFirst());
System.out.println(""+mock.streamMethod().findFirst());

findFirst的第二次调用将引发java.lang.IllegalStateException:流已被操作或关闭

4 个答案:

答案 0 :(得分:5)

尝试使用thenAnswer代替thenReturn

Answer<Stream> answer = new Answer<Stream>() {
    public Stream answer(InvocationOnMock invocation) throws Throwable {
        return Stream.of("A", "B");
    }
};


when(mock.streamMethod()).thenAnswer(answer);

现在将为每次streamMethod的调用创建一个新的流。

答案 1 :(得分:4)

您不是在模拟一个Stream,而是在创建一个-只有一个,在您遇到第一个终止方法后,它将被消耗。

在大多数情况下,最好根据您的情况坚持嘲笑

MyStreamClass mock = mock(MyStreamClass.class);
Stream mockStream = mock(Stream.class);
when(mock.streamMethod()).thenReturn(mockStream);

这足以测试MyStreamClass的所有客户端-从流中获取实际结果是没有意义的。

如果这不适合您的设计,则可以选择使用Answer

when(mock.streamMethod()).then(i -> Stream.of("A", "B"));

这将导致每次调用该方法时都创建流。

或者,您可以使用thenReturn()模拟多个呼叫。

when(mock.streamMethod()).thenReturn(Stream.of("A", "B"), Stream.of("A", "B"));

这将持续2个通话。

答案 2 :(得分:0)

尝试一下:

MyStreamClass mock = Mockito.mock(MyStreamClass.class);

Mockito.when(mock.streamMethod()).thenReturn(Stream.of("A", "B"));
Stream s = mock.streamMethod();

s.forEach(System.out::println);

答案 3 :(得分:0)

尝试然后使用Java 8方法进行回答

when(mock.streamMethod()).thenAnswer(invocation -> Stream.of("A", "B"))