Test – guava ticker cache expired
                                        
                    •
                    Java                                    
                Google guava tutorial says cache expiration can be tested with ticker
According to my understanding, I can use it to force quick expiration Am I right?
But I've tried the following code. It's useless. Do you have any suggestions?
@Test
public void expireAfterWriteTestWithTicker() throws InterruptedException {
    Ticker t = new Ticker() {
        @Override
        public long read() {
            return TimeUnit.MILLISECONDS.toNanos(5);
        }
    };
    //Use ticker to force expire in 5 millseconds
    LoadingCache<String,String> cache = CacheBuilder.newBuilder()
            .expireAfterWrite(20,TimeUnit.MINUTES).ticker(t).build(loader);
    cache.getUnchecked("hello");
    assertEquals(1,cache.size());
    assertNotNull(cache.getIfPresent("hello"));
    //sleep
    Thread.sleep(10);
    assertNull(cache.getIfPresent("hello"));    //Failed 
}
Solution
As long as you find the answer
Ticker can be used to skip time, but not for expiration time
class FakeTicker extends Ticker {
    private final AtomicLong nanos = new AtomicLong();
    /** Advances the ticker value by {@code time} in {@code timeUnit}. */
    public FakeTicker advance(long time,TimeUnit timeUnit) {
        nanos.addAndGet(timeUnit.toNanos(time));
        return this;
    }
    @Override
    public long read() {
        long value = nanos.getAndAdd(0);
        System.out.println("is called " + value);
        return value;
    }
}
@Test
public void expireAfterWriteTestWithTicker() throws InterruptedException {
    FakeTicker t = new FakeTicker();
    // Use ticker to force expire in 20 minute
    LoadingCache<String,TimeUnit.MINUTES).ticker(t).build(ldr);
    cache.getUnchecked("hello");
    assertEquals(1,cache.size());
    assertNotNull(cache.getIfPresent("hello"));
    // add 21 minutes
    t.advance(21,TimeUnit.MINUTES);
    assertNull(cache.getIfPresent("hello")); 
}
                
                            The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
                        
                                            
                        THE END
                    
                    
                    
                                                        二维码
                        
                        
                                                
                        