我有类RetrieveOrderService
,其中Execute
方法采用两个输入参数并使用供应商两次使用流。但是,当第二次调用 supplier.get()
时,它会抛出错误“流已被操作或关闭”,我不知道为什么。
class DataService{
public void getStream(){
Map<Order, String> orders = new HashMap<Order, String>
();
orders.put(new Order("1", "OPEN"), "t1");
orders.put(new Order("2", "CLOSE"), "t2");
return orders.keySet().stream();
}
}
class RetrieveOrderService {
@Inject DataService dataService;
public Map<String, Long> execute(String id, String type){
Supplier<Stream<Order>> supplier = dataService.getStream(): // This returns a stream
if(supplier.get().collect(Collectors.toList()).size == 0) {
return Collections.emptyMap();
}
Stream<Order> orders = supplier.get().filter(ordr -> order.getType().contains(type));
// my test fails here with error stream has already been operated or closed
}
}
class RetrieveOrderServiceTest {
@Mock DataService dataService;
@InjectMocks RetrieveOrderService service;
@Before
public void init(){
MockitoAnnotations.initMocks(this);
Supplier<Stream<Order>> supplier = service.getStream();
when(service.getStream()).thenReturn(supplier);
}
@Test
public void test(){
assertEquals(expected, service.execute("1", "OPEN"); // the test fails when supplier.get() is called second time in RetrieveOrderService.
}
}
最佳答案
如果您调用它两次,请通过添加另一个 thenReturn
来创建并返回一个新流
when(service.getStream()).thenReturn(service.getStream())
.thenReturn(service.getStream()); //(Presumably) Returns a fresh stream
您没有添加有关如何在 service.getStream()
后面生成流的详细信息。为了使其正常工作,每次调用 getStream
都必须返回一个由某些内容创建的新流。
更新
I have provided implementation for getStream()
您每次都在创建一个全新的流。所以,上面的应该有效
旁注:您不需要通过返回流来使事情变得复杂。我不知道这样做是否有任何理由。仅返回 map 会更简单(对于您的测试和读者)。因此,我同意@Ravindra Ranwala 的观点。
关于java - 如何模拟使用供应商创建并使用两次的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59315635/