我正在使用反应堆测试项目和StepVerifier来测试我的函数,myFunc
,它返回一个Flux<Result>
:
Flux<Result> results = myFunc()
StepVerifier.create(results). ..
在内部,myFunc
正在使用 resilience4j 的速率限制器,我想验证在使用 StepVerifier
完成流之前至少必须经过一段时间。
我如何使用StepVerifier
执行此操作?
更新 1:
请注意,myFunc()
对本地运行的(假(http 服务器进行实际调用以进行测试。所以我认为设置虚拟时间是不可能的。
更新 2:
例如,假设myFunc()
发出 30 个请求,速率限制配置为 10 rps,因此我希望订阅持续 3 秒多一点。 即我想验证是否发出了 30 个请求(expectNextCount(30)
(,并且一定时间(3 秒(必须经过。
,听起来 thenAwait(持续时间时移(方法就是您正在寻找的。
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.
您要查找的是expectNoEvent(Duration)
。请注意,订阅是一个(几乎(总是发生的事件,因此对于空序列,您应该具有类似以下内容的内容:
StepVerifier.create(result)
.expectSubscription()
.expectNoEvent(Duration.ofMillis(100))
.verifyComplete();
verify()
返回一个标记验证实际持续时间的Duration
对象。这样您就可以检查总共花费了多长时间。
但是,它似乎没有考虑withVirtualTime
- 它仍然会返回验证的实际持续时间,而不是虚拟时间,这使得它的用处要小得多。