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

标签 java java-8 java-stream

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

相关文章:

java - MappedByteBuffer 抛出 java.nio.BufferOverflowException

java - 如何以正确的格式粘贴日期?

java - 是否可以加入两个 Java 8 流?

java - 访问空组的流时,制作基于 Java 8 groupingBy 的映射 "null safe"

java - 将 HashMap 与流一起使用时进行索引

java - 如何对两个数据库使用 JTA 事务?

java - 在不知道字符集的情况下,通用函数如何处理字符?

java - Java 8 可以动态实现接口(interface)以供方法引用吗?

java - Java 8 数组构造函数引用如何工作?

java - Java8中可以通过流给object中的变量赋值吗?