2015-05-01 28 views
6

Google Guava samouczek powiedział ważności pamięci podręcznej mogą być testowane z TickerGuava Ticker Cache wygasają

jako mojego zrozumienia, mogę go używać, aby wymusić szybki wydech. Czy mam rację:?

ale próbowałem w poniższym kodzie, i to nie działało, żadnych sugestii?

@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 

} 
+1

Zamiast ' Thread.sleep', zwiększ wartość paska przez ponad 20 minut. Na przykład, zobacz te [testy jednostkowe] (https://github.com/ben-manes/caffeine/blob/master/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterWriteTest.java) –

+0

Dzięki. Teraz działa. – user3644708

Odpowiedz

10

Wystarczy znaleźć odpowiedź sama

Ticker może być używany do pominąć czas, ale nie czas ważności

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, String> cache = CacheBuilder.newBuilder() 
      .expireAfterWrite(20, 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")); 

} 
+5

Klasa 'FakeTicker' jest na' com.google.common.testing' –