【问题标题】:Retrieve all flux elements in StepVerifier检索 StepVerifier 中的所有通量元素
【发布时间】:2019-12-04 20:49:08
【问题描述】:

我正在测试助焊剂。我不知道助焊剂到底有多少元素。最初我尝试使用 StepVerifier 并遇到问题,因为我不知道这些元素。后来我提到了这个question 并尝试了同样的方法,但我收到以下错误: 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();

【问题讨论】:

    标签: spring-webflux project-reactor


    【解决方案1】:

    你实际上并没有消耗你的 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,因为它在实现相同目的的同时语义更清晰。

    【讨论】:

    • 这是一个很好的答案。如何确保 StepVerifier 将在特定时间结束?如果我的程序中有错误,通量可能永远不会完成。这意味着它将在 CI 服务器中运行很长时间。
    • .expectComplete().verify(Duration.of(10, ChronoUnit.SECONDS))StepVerifier.setDefaultTimeout() 在这种情况下可以提供帮助 @AnthonyKong
    • 在实践中,我还发现这个答案掩盖了任何可能导致测试失败的错误。我还没有找到解决方法。
    【解决方案2】:

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

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

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

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

    我确实做到了

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多