Java Reactor StepVerifier.withVirtualTime循环:反复检查“ expectNoEvent()”,“ expectNext()”和“ thenAwait()”

时间:2019-11-25 10:11:44

标签: java reactor

我正在学习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(),但它永远不会结束。我一定要吗?还是忽略它?

1 个答案:

答案 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:

<块引用>

此方法将阻塞,直到流终止