检索StepVerifier中的所有磁通元素

时间:2019-07-26 13:35:23

标签: spring-webflux project-reactor

我正在测试助焊剂。我不知道助焊剂到底有多少个元素。最初,我尝试使用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();

1 个答案:

答案 0 :(得分:2)

您实际上并没有消耗通量,只是设置了消耗时发生的情况。可以理解的是,您的verifyComplete();呼叫失败了,因为通量根本没有被消耗掉,因此还没有完成!

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

如果您像上面一样真的需要使用AssertJ,则可以执行以下操作:

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

但是,这里不需要AssertJ-反应堆测试包就足够了,添加其他测试框架会使测试代码更加不清楚IMHO。因此,如果您不喜欢AssertJ,请执行以下操作:

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

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