使用StepVerifier验证是否已过去至少一段时间?

时间:2019-02-08 08:32:09

标签: java spring unit-testing project-reactor

我正在使用reactor-test项目和StepVerifier测试我的函数myFunc,该函数返回一个Flux<Result>

Flux<Result> results = myFunc()

StepVerifier.create(results). ..

内部myFunc使用的是rate-limiterresilience4j,我想验证是否至少已经过去了 一段持续时间,然后才能使用StepVerifier

如何使用StepVerifier来做到这一点?

更新1:

请注意,myFunc()实际调用本地运行的(伪)http服务器以进行测试。因此,我认为无法设置虚拟时间。

更新2:

作为示例,假设myFunc()发出30个请求,并将速率限制配置为10 rps,所以我希望订阅持续3秒多一点。即我想验证是否发出了30个请求(expectNextCount(30)),并且一定时间(3s)必须过去。

3 个答案:

答案 0 :(得分:1)

在我看来,您正在寻找thenAwait(Duration timeshift)方法。

StepVerifier.Step<T> thenAwait(Duration timeshift)
Pause the expectation evaluation for a given Duration. If a VirtualTimeScheduler has been configured, VirtualTimeScheduler.advanceTimeBy(Duration) will be used and the pause will not block testing or Publisher thread.

答案 1 :(得分:0)

您要寻找的是expectNoEvent(Duration)。请注意,订阅是(几乎)总是发生的事件,因此对于空序列,您应该具有以下内容:

StepVerifier.create(result)
    .expectSubscription()
    .expectNoEvent(Duration.ofMillis(100))
    .verifyComplete();

答案 2 :(得分:0)

verify()返回一个Duration对象,该对象标记了验证的实际持续时间。这样,您可以检查总共花费了多长时间。

但是,似乎没有考虑withVirtualTime -它仍然会返回验证的实际持续时间,而不是虚拟时间,这使它的用处大大减少。