Это то, что я использую. Я нашел это в книге: Test Driven - Практический TDD и TDD Acceptance для разработчиков Java Лассе Коскела.
public interface TimeSource {
long millis();
}
public class SystemTime {
private static TimeSource source = null;
private static final TimeSource DEFAULTSRC =
new TimeSource() {
public long millis() {
return System.currentTimeMillis();
}
};
private static TimeSource getTimeSource() {
TimeSource answer;
if (source == null) {
answer = DEFAULTSRC;
} else {
answer = source;
}
return answer;
}
public static void setTimeSource(final TimeSource timeSource) {
SystemTime.source = timeSource;
}
public static void reset() {
setTimeSource(null);
}
public static long asMillis() {
return getTimeSource().millis();
}
public static Date asDate() {
return new Date(asMillis());
}
}
Обратите внимание, что источником времени по умолчанию, DEFAULTSRC, является System.currentTimeMillis (). Заменено в юнит-тестах; однако нормальным поведением является стандартное системное время.
Вот где он используется:
public class SimHengstler {
private long lastTime = 0;
public SimHengstler() {
lastTime = SystemTime.asMillis(); //System.currentTimeMillis();
}
}
А вот и юнит-тест:
import com.company.timing.SystemTime;
import com.company.timing.TimeSource;
public class SimHengstlerTest {
@After
public void tearDown() {
SystemTime.reset();
}
@Test
public final void testComputeAccel() {
// Setup
setStartTime();
SimHengstler instance = new SimHengstler();
setEndTime(1020L);
}
private void setStartTime() {
final long fakeStartTime = 1000L;
SystemTime.setTimeSource(new TimeSource() {
public long millis() {
return fakeStartTime;
}
});
}
private void setEndTime(final long t) {
final long fakeEndTime = t; // 20 millisecond time difference
SystemTime.setTimeSource(new TimeSource() {
public long millis() {
return fakeEndTime;
}
});
}
В модульном тесте я заменил TimeSource просто числом, которое было установлено на 1000 миллисекунд. Это послужит временем начала. При вызове setEndTime () я вводил 1020 миллисекунд для времени окончания. Это дало мне контролируемую разницу во времени в 20 миллисекунд.
В рабочем коде нет тестового кода, просто получается обычное системное время.
Обязательно вызовите сброс после тестирования, чтобы вернуться к использованию метода системного времени, а не фальсифицированного времени.