Java 需要帮助为返回通量流作为输出的函数编写junit测试吗

Java 需要帮助为返回通量流作为输出的函数编写junit测试吗,java,spring-boot,spring-webflux,project-reactor,Java,Spring Boot,Spring Webflux,Project Reactor,我需要帮助为返回通量流作为输出的函数编写单元测试 我试过使用StepVerifier,但我想我用错了 需要测试以下功能 public Flux<List<String>> streamCompletedScansAfterLastSubmit(@PathVariable("username") String username) { Flux<Long> interval = Flux.interval(Duration.ofSeconds(5));

我需要帮助为返回通量流作为输出的函数编写单元测试

我试过使用StepVerifier,但我想我用错了

需要测试以下功能

public Flux<List<String>> streamCompletedScansAfterLastSubmit(@PathVariable("username") String username) {
    Flux<Long> interval = Flux.interval(Duration.ofSeconds(5));
    Flux<List<String>> completeScans = Flux.fromStream(Stream.generate(() -> scanService.getCompletedScansAfterLastSubmitForUser(username)));
    return Flux.zip(interval, completeScans).map(Tuple2::getT2);
  }
我得到一个错误:

java.lang.AssertionError:预期“expectComplete”失败(预期:onComplete();实际:onNext([Scan1:Success]))

不知怎的,服务方法被调用了两次(我检查了使用doAnswer)

流。generate(Supplier)
生成无限的
流,因此
completeScan
也是无限的

由于
interval
也是无限的,使用mock服务,这两种服务的压缩会产生
流量
,每5秒发出
[“Scan1:Success”]

相反,您的
StepVerifier
期望在终止前对单个列表进行非常有限的
流量
,因此它在看到列表的第二次出现时立即失败

Stream.generate(Supplier)
生成无限的
流,因此
completeScans
也是无限的

由于
interval
也是无限的,使用mock服务,这两种服务的压缩会产生
流量
,每5秒发出
[“Scan1:Success”]


相反,您的
StepVerifier
期望在终止前对单个列表进行非常有限的
流量
,因此它在看到列表的第二次出现时立即失败

是的,目前已经修复了这个问题,需要从流中获取有限数量的元素并断言它们StepVerifier.create(apiScanController.streamCompletedScansAfterLastSubmit(“abc”).take(2)).expectNext(Arrays.asList(“Scan1:Success”)).expectNext(Arrays.asList(“Scan2:Error”)).verifyComplete()```是的,这是一个好办法。您还可以在确信收到了一致的值后取消源代码,方法是使用
然后取消()。verify()
而不是
verifyComplete()
是,当前已修复了它,希望从流中获得有限数量的元素并断言它们StepVerifier.create(apiScanController.streamCompletedScansAfterLastSubmit(“abc”).take(2)).expectNext(Arrays.asList(“Scan1:Success”)).expectNext(Arrays.asList(“Scan2:Error”)).verifyComplete()```是的,这是一个好办法。您还可以在确信收到一致的值后,通过使用
然后取消().verify()
而不是
verifyComplete()
  public void shouldPublishTheAssessmentStatusOnceFinished() {
    when(scanService.getCompletedScansAfterLastSubmitForUser(Mockito.anyString())).thenReturn(Arrays.asList("Scan1:Success"));
    StepVerifier.create(apiScanController.streamCompletedScansAfterLastSubmit("quays_ka"))
      .expectSubscription()
      .expectNext(Arrays.asList("Scan1:Success"))
      .verifyComplete();
  }