我正在学习Java 11反应器。我看过这个例子:
StepVerifier.withVirtualTime(() -> Flux.interval(Duration.ofSeconds(1)).take(3600))
.expectSubscription()
.expectNextCount(3600);
此示例仅检查Flux<Long>
,它每隔一秒递增1,直到一小时,最终计数为3600。
但是,每秒有什么方法可以重复检查计数器吗?
我知道这一点:
.expectNoEvent(Duration.ofSeconds(1))
.expectNext(0L)
.thenAwait(Duration.ofSeconds(1))
但是我没有办法每秒之后重复检查一次,就像:
.expectNoEvent(Duration.ofSeconds(1))
.expectNext(i)
.thenAwait(Duration.ofSeconds(1))
i
递增到3600时出现了。
PS:
我试图在长时间运行的测试中最后添加verifyComplete()
,但它永远不会结束。我一定要吗?还是忽略它?
答案 0 :(得分:0)
您可以通过使用 expectNextSequence
来实现您想要的。您必须传递一个 Iterable
并包含您希望到达的每个元素。请参阅下面的示例:
var longRange = LongStream.range(0, 3600)
.boxed()
.collect(Collectors.toList());
StepVerifier
.withVirtualTime(() -> Flux.interval(Duration.ofSeconds(1)).take(3600))
.expectSubscription()
.thenAwait(Duration.ofHours(1))
.expectNextSequence(longRange)
.expectComplete().verify();
如果您不添加 verifyComplete()
或 expectComplete().verify()
,则 JUnit 测试不会等到元素从通量到达并终止。
要进一步参考,请参阅 verify()
的 JavaDoc:
此方法将阻塞,直到流终止