使用 spring-webflux WebClient 测试虚拟时间时出现问题
Problem with testing virtual time with spring-webflux WebClient
当我使用 monoFromSupplier
作为 selectedMono
时,下面的测试通过了。
但是,当我切换到 monoFromWebClient
时,它不会正确地提前时间。我在这里做错了什么?
StepVerifier.withVirtualTime(() -> {
Mono<String> monoFromSupplier = Mono.fromSupplier(() -> "AA")
.doOnNext(po -> {
System.out.println("monoFromSupplier:onNext " + Thread.currentThread().getName());
});
Mono<String> monoFromWebClient = WebClient.create("http://...")
.get()
.retrieve()
.bodyToMono(String.class)
.doOnNext(po -> {
System.out.println("monoFromWebClient:onNext " + Thread.currentThread().getName());
});
Mono<?> selectedMono = monoFromSupplier;
return selectedMono.repeatWhen(companion -> companion.take(3)
.delayUntil(r -> {
Duration dur = Duration.ofSeconds(500);
System.out.println("delay... " + dur);
return Mono.delay(dur);
}))
.last()
.log();
})
.thenAwait(Duration.ofDays(1))
.expectNextCount(1)
.expectComplete()
.verify();
Reactor 虚拟时间支持仅适用于单个 JVM - 它通过更改 Scheduler
的时钟(通常使其滴答更快)来工作。 WebClient
这里跨越网络边界并发送真实的 HTTP 请求 - Reactor 无法操纵真实的物理时间。
TL;DR;这是不支持的。
当我使用 monoFromSupplier
作为 selectedMono
时,下面的测试通过了。
但是,当我切换到 monoFromWebClient
时,它不会正确地提前时间。我在这里做错了什么?
StepVerifier.withVirtualTime(() -> {
Mono<String> monoFromSupplier = Mono.fromSupplier(() -> "AA")
.doOnNext(po -> {
System.out.println("monoFromSupplier:onNext " + Thread.currentThread().getName());
});
Mono<String> monoFromWebClient = WebClient.create("http://...")
.get()
.retrieve()
.bodyToMono(String.class)
.doOnNext(po -> {
System.out.println("monoFromWebClient:onNext " + Thread.currentThread().getName());
});
Mono<?> selectedMono = monoFromSupplier;
return selectedMono.repeatWhen(companion -> companion.take(3)
.delayUntil(r -> {
Duration dur = Duration.ofSeconds(500);
System.out.println("delay... " + dur);
return Mono.delay(dur);
}))
.last()
.log();
})
.thenAwait(Duration.ofDays(1))
.expectNextCount(1)
.expectComplete()
.verify();
Reactor 虚拟时间支持仅适用于单个 JVM - 它通过更改 Scheduler
的时钟(通常使其滴答更快)来工作。 WebClient
这里跨越网络边界并发送真实的 HTTP 请求 - Reactor 无法操纵真实的物理时间。
TL;DR;这是不支持的。