这是Flux.cache中的错误(历史,ttl)?

时间:2017-03-12 12:50:37

标签: java project-reactor

以下代码

        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

1 个答案:

答案 0 :(得分:0)

缓存和TTL测试起来有点棘手,因为在缓存时,您要测试的是第二 Subscriber所看到的内容。对于原始缓存的Fluxcache运算符只是传递。第一遍是StepVerifier测试的(它执行了第一次订阅)。

为了解决这个问题,只需在供应商内部立即提取Suppliersubscribe

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