为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

江户川乱折腾 2022-06-15 16:53:08
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
查看完整描述

4 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

尝试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);

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


进一步阅读:


这是我在 Mockito中写的一篇关于动态回答的文章,可能是互补的。


查看完整回答
反对 回复 2022-06-15
?
炎炎设计

TA贡献1808条经验 获得超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 个电话。


查看完整回答
反对 回复 2022-06-15
?
波斯汪

TA贡献1811条经验 获得超4个赞

尝试 thenAnswer 使用 Java 8 方法

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


查看完整回答
反对 回复 2022-06-15
?
茅侃侃

TA贡献1842条经验 获得超22个赞

尝试这个:


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


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

Stream s = mock.streamMethod();


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


查看完整回答
反对 回复 2022-06-15
  • 4 回答
  • 0 关注
  • 200 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号