猿问

模拟一个返回 Stream 并被多次调用的方法

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: stream has already been operating on or closed


江户川乱折腾
浏览 201回答 4
4回答

倚天杖

尝试thenAnswer代替thenReturn:Answer<Stream> answer = new Answer<Stream>() {&nbsp; &nbsp; public Stream answer(InvocationOnMock invocation) throws Throwable {&nbsp; &nbsp; &nbsp; &nbsp; return Stream.of("A", "B");&nbsp; &nbsp; }};when(mock.streamMethod()).thenAnswer(answer);现在将为每次调用创建一个新的 Stream streamMethod。进一步阅读:这是我在 Mockito中写的一篇关于动态回答的文章,可能是互补的。

炎炎设计

您不是在模拟 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 个电话。

波斯汪

尝试 thenAnswer 使用 Java 8 方法when(mock.streamMethod()).thenAnswer(invocation&nbsp;->&nbsp;Stream.of("A",&nbsp;"B"))

茅侃侃

尝试这个:MyStreamClass mock = Mockito.mock(MyStreamClass.class);Mockito.when(mock.streamMethod()).thenReturn(Stream.of("A", "B"));Stream s = mock.streamMethod();s.forEach(System.out::println);
随时随地看视频慕课网APP

相关分类

Java
我要回答