Один из подходов, который лучше всего подходит для модульного тестирования, состоит в том, чтобы абстрагировать способ доступа к текущему времени в коде.
Вместо непосредственного вызова System.currentTimeMillis () вы можете предоставить собственную реализацию.
Примерно так (псевдокод):
class MyTime {
private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl();
public setTimeInterface(TimeInterface timeInterface) {
CurrentTimeInterface = timeInterface;
}
public int getTime() { CurrentTimeInterface.getTime(); }
}
class DefaultTimeImpl implements TimeInterface {
public int getTime() { return System.currentTimeMillis(); }
}
class TestTimeImpl implements TimeInterface {
private int CurrentTimeMillis = 0;
public int getTime() { return CurrentTimeMillis; }
public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis}
public void sleep(int millis) { CurrentTimeMillis += millis; }
}
Тогда везде, где вы бы вызывали System.getTimeMillis (), вместо этого вызывайте MyTime.getTime (). Когда вы тестируете свой код, просто создайте TestTimeImpl и вызовите MyTime.setTimeInterface (testTimeImpl). Затем, когда вам нужно время для предварительного вызова, вызовите testTimeImpl.sleep () или testTimeImpl.setTime ().
Это позволяет вам моделировать любое время вплоть до миллисекунды.