我正在测试助焊剂。我不知道助焊剂到底有多少个元素。最初,我尝试使用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();
答案 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
,因为在实现相同目的的语义上更清晰。