Flux bufferMillis - 如何测试?

时间:2017-03-05 17:21:44

标签: java project-reactor

我尝试使用虚拟调度程序测试Flux.bufferMillis,但似乎间歇性失败。 以下是

的代码
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))

我不确定为什么Scheduler偶尔会无法使用。

1 个答案:

答案 0 :(得分:0)

当您只提供StepVerifierSupplier<Flux>时,

verify()和虚拟时间大致相同:

  1. StepVerifier获取“虚拟时间调度程序”实例。
  2. 它将核心的SchedulerFactory替换为将虚拟时间调度程序返回给需要默认调度程序的所有运算符。
  3. 它呼叫供应商创建要测试的运营商链,并订阅它,然后播放并验证该方案。
  4. 最后,它清理并关闭它使用的虚拟调度程序。
  5. 这是并行运行测试时可能出现问题的地方:由于只有1个工厂,并且由于获得VTS的方式,进行2次并行虚拟时间测试可能导致使用相同的VirtualTimeScheduler实例在后台。因此,第一个测试将关闭调度程序,第二个测试将是REJECTED

    gradle-scalatest runs in parallel by default以来,这很可能是您问题的根源。