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