gpt4 book ai didi

java - 如何模拟使用供应商创建并使用两次的流?

转载 作者:行者123 更新时间:2023-12-02 09:12:08 25 4
gpt4 key购买 nike

我有类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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com