我正在使用reactor-test项目和StepVerifier测试我的函数myFunc
,该函数返回一个Flux<Result>
:
Flux<Result> results = myFunc()
StepVerifier.create(results). ..
内部myFunc
使用的是rate-limiter的resilience4j,我想验证是否至少已经过去了 一段持续时间,然后才能使用StepVerifier
。
如何使用StepVerifier
来做到这一点?
更新1:
请注意,myFunc()
实际调用本地运行的(伪)http服务器以进行测试。因此,我认为无法设置虚拟时间。
更新2:
作为示例,假设myFunc()
发出30个请求,并将速率限制配置为10 rps,所以我希望订阅持续3秒多一点。即我想验证是否发出了30个请求(expectNextCount(30)
),并且一定时间(3s)必须过去。
答案 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
-它仍然会返回验证的实际持续时间,而不是虚拟时间,这使它的用处大大减少。