Java 使用StepVerifier验证是否至少经过了一段时间?
我正在使用project和来测试我的函数,Java 使用StepVerifier验证是否至少经过了一段时间?,java,spring,unit-testing,project-reactor,Java,Spring,Unit Testing,Project Reactor,我正在使用project和来测试我的函数,myFunc,它返回一个Flux: Flux results=myFunc() 步骤验证程序。创建(结果)。。 内部myFunc正在使用from,我想验证在使用StepVerifier完成流之前必须至少经过一段时间 如何使用步进验证器 更新1: 请注意,myFunc()实际调用本地运行的(假的)http服务器以进行测试。所以我认为设置虚拟时间是不可能的 更新2: 例如,假设myFunc()发出30个请求,速率限制配置为10 rpm,因此我预计订阅将持续
myFunc
,它返回一个Flux
:
Flux results=myFunc()
步骤验证程序。创建(结果)。。
内部myFunc
正在使用from,我想验证在使用StepVerifier
完成流之前必须至少经过一段时间
如何使用步进验证器
更新1:
请注意,myFunc()
实际调用本地运行的(假的)http服务器以进行测试。所以我认为设置虚拟时间是不可能的
更新2:
例如,假设
myFunc()
发出30个请求,速率限制配置为10 rpm,因此我预计订阅将持续3秒多一点。也就是说,我想确认已经发出了30个请求(expectNextCount(30)
),并且一定时间(3秒)已经过去。对我来说,听起来等待(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.
StepVerifier.Step然后等待(持续时间时间移位)
在给定的持续时间内暂停期望评估。如果已配置VirtualTimeScheduler,则将使用VirtualTimeScheduler.advanceTimeBy(持续时间),暂停不会阻止测试或发布线程。
您要查找的是expectNoEvent(持续时间)
。请注意,订阅是一个(几乎)总是发生的事件,因此对于空序列,您应该有如下内容:
StepVerifier.create(result)
.expectSubscription()
.expectNoEvent(Duration.ofMillis(100))
.verifyComplete();
verify()
返回标记验证实际持续时间的Duration
对象。这样你就可以检查总共花了多长时间
然而,它似乎没有考虑到虚拟时间的
,
-它仍然会返回验证的实际持续时间,而不是虚拟时间,这使得它没有那么有用。谢谢你的建议,但它似乎不起作用。如果我尝试StepVerifier.create(results.),然后等待(Duration.ofMillis(10)).verifyComplete()
,那么即使需要几秒钟才能完成,它也不会失败。我明白了。很抱歉,我没有选择测试它。然而,我不知道这是否是故意的,但如果不是,你已经指定了10毫秒,也就是1/100秒。我不确定它是否在等待更多,这可能意味着它仍然是一段逝去的时间。如果你想要秒,它应该是持续时间秒(numberofseconds)。我只是想演示一个我预期测试失败的例子(因为它预计需要超过一秒),但它没有。我明白了。谢谢你的澄清!我会进一步调查的!似乎我错过了一个重要的部分:有一个名为withVirtualTime
的方法。应该在使用thenAwait()
之前添加它。您尝试过吗?这不起作用,因为我确实需要数据。例如,如果我发出30个速率限制设置为10 rpm的请求,那么我预计订阅将持续3秒多一点。这就是我想核实的。我将更新问题以反映这一点。