Как предлагается в книге Test Driven , хорошей практикой является использование абстракции SystemTime в ваших классах Java.Замените ваши вызовы методов (System # currentTimeMillis и Calendar # getInstance) и прямое построение (new Date ()) статическими вызовами методов, такими как:
long time = SystemTime.asMillis();
Calendar calendar = SystemTime.asCalendar();
Date date = SystemTime.asDate();
Чтобы подделать время, вам просто нужно изменить то, что возвращает вашКласс SystemTime.
SystemTime использует интерфейс TimeSource, который по умолчанию делегирует System.currentTimeMillis ()
public interface TimeSource {
long millis();
}
настраиваемая реализация SystemTime, которая может выглядеть примерно так:
public class SystemTime {
private static final TimeSource defaultSrc =
new TimeSource() {
public long millis() {
return System.currentTimeMillis();
}
};
private static TimeSource source = null;
public static long asMillis() {
return getTimeSource().millis();
}
public static Date asDate() {
return new Date(asMillis());
}
public static void reset() {
setTimeSource(null);
}
public static void setTimeSource(TimeSource source) {
SystemTime.source = source;
}
private static TimeSource getTimeSource() {
return (source != null ? source : defaultSrc);
}
}
ифальшивое возвращенное время вы просто делаете
@Test
public void clockReturnsFakedTimeInMilliseconds() throws Exception {
final long fakeTime = 123456790L;
SystemTime.setTimeSource(new TimeSource() {
public long millis() {
return fakeTime;
}
});
long clock = SystemTime.asMillis();
assertEquals("Should return fake time", fakeTime, clock);
}
Библиотека Joda-Time упрощает работу с датами в Java и предлагает вам что-то подобное из коробки