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:流已被操作或关闭
答案 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"))