2017-07-19 5 views
1

私のコードのいくつかをカスタムの有効期限でテストするとき、私はCazeineのキャッシュでカスタムティッカーを使って時間を設定する方法と非常によく似て、Hazelcastのインスタンスで時計の時刻を設定する必要がありました。ユニットテスト用にHazelcastでカスタムクロックを実装する方法は?

これはどこにも記載されておらず、それに関する質問はありません。 HazelcastInstanceのソースコードを追跡する際に、カスタムクロックを使用すると、システムプロパティを設定している場合、com.hazelcast.clock.impl

これは、この時計を設定するために、Hazelcastはそのクロックだから、

package com.hazelcast.util; 

... 

public final class Clock { 

    private static final ClockImpl CLOCK; 
    private Clock() { 
    } 

    /** Returns the current time in ms for the configured {@link ClockImpl} */ 
    public static long currentTimeMillis() { 
     return CLOCK.currentTimeMillis(); 
    } 

    static { 
     CLOCK = createClock(); 
    } 

    static ClockImpl createClock() { 
     String clockImplClassName = System.getProperty(ClockProperties.HAZELCAST_CLOCK_IMPL); 
     if (clockImplClassName != null) { 
      try { 
       return ClassLoaderUtil.newInstance(null, clockImplClassName); 
      } catch (Exception e) { 
       throw rethrow(e); 
      } 
     } 

     String clockOffset = System.getProperty(ClockProperties.HAZELCAST_CLOCK_OFFSET); 
     long offset = 0L; 
     if (clockOffset != null) { 
      try { 
       offset = Long.parseLong(clockOffset); 
      } catch (NumberFormatException e) { 
       throw rethrow(e); 
      } 
     } 
     if (offset != 0L) { 
      return new SystemOffsetClock(offset); 
     } 

     return new SystemClock(); 
    } 
} 

をロードする方法です

答えて

0

を実装することができますシステムプロパティを独自の時計で設定する必要があります。

public class MyHazelcastCacheTest { 
    static { 
     // set unit test time travelling clock 
     System.setProperty(ClockProperties.HAZELCAST_CLOCK_IMPL, TimeTravellingStaticClock.class.getName()); 
    } 

    private void timeTravel(Clock clock) { 
     TimeTravellingStaticClock.timeTravel(clock); 
    } 

    private void undoTimeTravel() { 
     TimeTravellingStaticClock.undoTimeTravel(); 
    } 

    private static class TimeTravellingStaticClock extends com.hazelcast.util.Clock.ClockImpl { 
     private static Clock sClock = Clock.systemUTC(); 

     public TimeTravellingStaticClock() { 
      // nothing 
     } 

     public static void timeTravel(Clock clock) { 
      sClock = clock; 
     } 

     public static void undoTimeTravel() { 
      sClock = Clock.systemUTC(); 
     } 

     @Override 
     protected long currentTimeMillis() { 
      return sClock.millis(); 
     } 
    } 
} 
関連する問題