在 StepVerifier 中检索所有通量元素

Retrieve all flux elements in StepVerifier

我正在测试助焊剂。我不知道助焊剂到底有多少元素。最初我尝试使用 StepVerifier 并遇到问题,因为我不知道这些元素。后来我参考了这个 并尝试了同样的但我收到以下错误: java.lang.AssertionError: expectation "expectComplete" failed (expected: onComplete(); actual: onNext

我的理解是,我的代码需要一个完整的信号,但通量还剩下一些元素(因此它给出 onNext() 而不是 onComplete())。请帮助我了解我遗漏的地方。下面是我的代码:

StepVerifier.create(flux)
            .recordWith(ArrayList::new)
            .consumeRecordedWith(elements-> {assertThat(elements.size()).isGreaterThan(0);})
            .verifyComplete();

您实际上并没有消耗您的 Flux,您只是在设置 消耗它时发生的事情。您的 verifyComplete(); 调用随后失败,这是可以理解的,因为 Flux 根本没有被消耗,因此它还没有完成!

您需要添加一个 thenConsumeWhile() 调用才能实际使用它。

如果您确实需要像上面那样使用AssertJ,那么您可以这样做:

StepVerifier.create(flux)
        .recordWith(ArrayList::new)
        .thenConsumeWhile(x -> true)
        .consumeRecordedWith(elements -> {
            assertThat(elements.isEmpty()).isFalse();
        })
        .verifyComplete();

然而,这里不需要 AssertJ - reactor 测试包就足够了,添加额外的测试框架会使测试代码更不清晰恕我直言。因此,如果您不喜欢 AssertJ,只需执行以下操作:

StepVerifier.create(flux)
        .recordWith(ArrayList::new)
        .thenConsumeWhile(x -> true)
        .expectRecordedMatches(elements -> !elements.isEmpty())
        .verifyComplete();

请注意,在实际使用中,您可能希望调整 thenConsumeWhile 中的谓词,以便它也依次对每个元素运行检查。我还调整了上面的代码以使用 isEmpty() 而不是检查是否 size()>0,因为它在实现相同目的的同时在语义上更清晰。

来自同一个问题,有一些新的东西:我的 flux 中有太多条目以至于无法放入内存 (是的,那些测试用例装置就是这样设计的)...

因此,将所有内容缓冲到 List 中不是一种选择。

我在 StepVerifier 上尝试了不同的 API 方法,发现以下方法有效:

StepVerifier.create( myFlux )
  .thenConsumeWhile( Predicate<T>, Consumer<T> )
  .verifyComplete();

我真的做到了

StepVerifier.create( myFlux )
  .thenConsumeWhile( __ -> true, entry -> {
    // assertions
  } )
  .verifyComplete();