unit-testing - Stream has already been operated upon or closed in Mockito?
问题描述
I want to test a method to return a stream.
class Foo {
public void getClicks(boolean somecondition) {
Stream s1 = computeAndGetAllClicks(new Date());
if (somecondition) {
Stream s2 = computeAndGetAllClicks(new Date());
}
return Stream.concat(s1, s2);
}
Stream computeAndGetAllClicks(Date d) {
// return stream
}
}
Now I have written the following test for case when somecondition = true
final ArgumentCaptor<Date> argumentCaptorTodayDate = ArgumentCaptor.forClass(Date.class);
doReturn(Arrays.asList(new Click.Builder().build()).stream())
.when(fooInstance)
.addAtlasLineItem(computeAndGetAllClicks(argumentCaptorTodayDate.capture))
final ArgumentCaptor<Date> argumentCaptorEndDate = ArgumentCaptor.forClass(Date.class);
doReturn(Arrays.asList(new Click.Builder().build()).stream())
.when(fooInstance)
.addAtlasLineItem(computeAndGetAllClicks(argumentCaptorEndDate.capture))
fooInstance.getClicks(true);
However I get exception: java.lang.IllegalStateException: stream has already been operated upon or closed.
How do I get around it ??
解决方案
您可以使用 thenAnswer 并在每次调用它时创建新流:
doAnswer(invocationOnMock->Arrays.asList(new Click.Builder().build()).stream())
推荐阅读
- c# - 如何在 Xamarin 的滚动视图中相对于屏幕大小调整内容的大小?
- angular - 如何在动态创建的组件上使用带有 RxJS 间隔的异步管道?
- python - Tensorflow:使用线程池进行多 CPU 推理
- python - 如何以不同的方式随机选择python?
- java - 如何在 ldap 中按对象 SID 搜索用户
- postscript - 将字符串作为 PostScript 指令执行
- php - WordPress 中的 PHP DOM - 在输出缓冲区 HTML 中添加属性
- clojure - clojure 的“doc”命令打印出来是什么?
- javascript - 按下提交按钮后,寻找我的 Javascript 加载程序以激活
- swift - 填充 CirleProgressView 并将结果保存到 UserDefaults