Caffeine - Caches - Testing
测试
FakeTicker ticker = new FakeTicker(); // Guava's testlib
Cache<Key, Graph> cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.executor(Runnable::run)
.ticker(ticker::read)
.maximumSize(10)
.build();
cache.put(key, graph);
ticker.advance(30, TimeUnit.MINUTES)
assertThat(cache.getIfPresent(key), is(nullValue()));
测试过期剔除不需要在挂钟的时间消逝中等待。使用Ticker接口和Caffeine.ticker(Ticker)方法在缓存构建器中指定一个时间源,而不必等待系统时钟。为此,Guava的testlib提供了一个方便的实现FakeTicker。由于过期条目的移除是在维护周期内执行的,因此当测试依赖于已发生的剔除时,请使用Cache.cleanUp()立即触发移除操作。
Caffeine将定期维护、移除通知和异步计算委托给Executor。这种方式不占用调用者的时间,更加提高了响应时间的可预测性,Executor默认使用ForkJoinPool.commonPool()。使用Caffeine.executor(Executor)在缓存构建时指定一个直接(相同线程)执行器,而不必等待异步任务完成。
多线程测试时我们建议使用Awaitility。