以下代码
StepVerifier.withVirtualTime((Supplier<Publisher<?>>) () -> Flux.just(1, 2, 3).cache(2, Duration.ofSeconds(10)))
.thenAwait(Duration.ofSeconds(5))
.expectNext(2, 3)
.verifyComplete();
失败,异常
java.lang.AssertionError: expectation "expectNext(2)" failed (expected value: 2; actual value: 1)
如果我将预期值更改为
.expectNext(1, 2, 3)
它会通过。所以它不尊重history
方法中提供的cache
?
答案 0 :(得分:0)
缓存和TTL测试起来有点棘手,因为在缓存时,您要测试的是第二 Subscriber
所看到的内容。对于原始缓存的Flux
,cache
运算符只是传递。第一遍是StepVerifier
测试的(它执行了第一次订阅)。
为了解决这个问题,只需在供应商内部立即提取Supplier
和subscribe
:
Supplier<Flux<Integer>> supplier = () -> {
Flux<Integer> tested = Flux.just(1, 2, 3)
.cache(2, Duration.ofSeconds(10))
.log();
tested.subscribe();
return tested;
};
StepVerifier.withVirtualTime(supplier)
.thenAwait(Duration.ofSeconds(5))
.expectNext(2, 3)
.verifyComplete();
这测试是否遵守缓存的历史限制。
TTL是另一回事。根据到达&#34; rythm&#34;它不是缓存项目的到期时间用于以后的重放,而是关于是否缓存项目的条件。来源。因此,它更依赖于源的排放延迟。请参阅FluxCacheTest
中的测试以及他们如何使用delayElements
。