检索 StepVerifier 中的所有通量元素

Ant*_*Raj 8 project-reactor spring-webflux

我正在测试助焊剂。我不知道通量到底有多少元素。最初我尝试过 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();
Run Code Online (Sandbox Code Playgroud)

Mic*_*rry 13

你实际上并没有消耗你的 Flux,你只是在设置它被消耗时会发生什么。你的verifyComplete();调用失败了,这是可以理解的,因为 Flux 根本没有被消耗掉,因此它不完整!

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

如果你真的需要AssertJ像上面那样使用,那么你可以这样做:

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

但是,这里没有必要AssertJ- 反应器测试包就足够了,并且添加额外的测试框架会使测试代码变得不那么清晰恕我直言。因此,如果您不喜欢 AssertJ,请执行以下操作:

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

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

  • 这是一个很好的答案。如何确保 StepVerifier 在特定时间结束?如果我的程序中存在错误,则通量可能永远不会完成。这意味着它将在 CI 服务器中运行很长时间。 (3认同)