Java 通量缓冲毫秒-如何测试?
我试图使用虚拟调度器测试Flux.bufferMillis,但它似乎间歇性失败。 下面是要修改的代码Java 通量缓冲毫秒-如何测试?,java,project-reactor,Java,Project Reactor,我试图使用虚拟调度器测试Flux.bufferMillis,但它似乎间歇性失败。 下面是要修改的代码 StepVerifier.withVirtualTime(new Supplier() { Flux get() { return Flux.interval(1 second).take(5).bufferMillis(1500); }} ) .thenAwait(5 seconds) .expectNext(...) .verifyCo
StepVerifier.withVirtualTime(new Supplier() {
Flux get() {
return Flux.interval(1 second).take(5).bufferMillis(1500);
}}
)
.thenAwait(5 seconds)
.expectNext(...)
.verifyComplete();
我间歇性地得到的错误如下:
java.lang.AssertionError: expectation "expectNextMatches" failed (expected: onNext(); actual: onError(java.util.concurrent.RejectedExecutionException: Scheduler unavailable))
我不知道为什么调度程序偶尔不可用。
步验证程序和虚拟时间在您只提供供应商和验证()时大致是这样工作的:
StepVerifier
获取一个“虚拟时间调度器”实例
它将核心的SchedulerFactory
替换为将虚拟时间调度器返回给所有需要默认调度器的操作员的虚拟时间调度器
它调用供应商创建要测试的操作员链,并订阅它,然后播放和验证场景
最后,它清理并关闭它使用的虚拟调度器
这就是并行运行测试时可能出现的问题:因为只有一个工厂,而且由于VTS的获取方式,有两个并行虚拟时间测试可能导致在后台使用相同的VirtualTimeScheduler
实例。因此,第一个测试将关闭调度程序,第二个测试将被拒绝
由于gradle scalatest
,这很可能是问题的根源。我无法在反应堆的JUnit测试中重现它,无论是在master还是在3.0.4.RELEASE标签上。。。这就是你测试的全部内容吗?在同一次运行中执行的任何其他测试?如果VirtualTimeScheduler
已被dispose()
(或等效的已弃用关闭
),则会发生这种情况。如果测试由gradle与其他测试一起运行,则通常会发生这种情况。您可以在主分支中检查整个测试。我认为这是由于并行测试的默认行为造成的。StepVerifier的虚拟时间取决于SchedulerFactory的顺序设置,而不是并行设置。你可以不用测试并行性来试试吗?谢谢,我会试试的。但这是间歇性的,所以我必须运行多次,以确保它修复了问题,我会将此标记为答案。但是,可以进行改进,使调度器只在不再有引用时才应该关闭。它似乎没有将并行度设置为1来解决问题。事情还在发生。它正在通过我的本地机器,但不在CI中。好的,然后还有其他事情发生。。。我们需要更多信息(测试失败stacktrace),最好在本地复制它。你能在reactor插件的github中打开一个问题并尝试收集stacktrace吗?等等,在你上次TravisCI失败的构建中,你有一个运行正常的测试,然后运行一个失败的scoverage
。。。您没有将SCoverage配置为按顺序运行,因此很可能仍然存在相同的问题。请参阅以防止并行性我们将尝试在VirtualTimeScheduler中添加引用计数和/或简化StepVerifier+VTS体验,但该建议有很好的潜力;)