Hej
Prawdopodobnie już istnieje coś takiego, ale w ramach wolnego czasu postanowiłem zabrać się za pisanie biblioteki dającą dodatkową abstrakcje w kodzie aplikacji która byłaby odpowiedzialna za czas. Po co? Chodzi mi o to, żeby móc w testach wykonać natychmiastowy 'skok' w czasie do przodu, ale żeby wszystkie zaplanowane akcje podczas tego 'przeskoku' zostały wykonane. Dodatkowo aby łatwo móc zmienić czas systemowy aplikacji, bez jakieś większe zabawy w mocki. Przykładowy kod:
@Test
public void hackIntoFutureTest(){
Foo foo = new Foo(); // object with int value
FooAdd runnable = new FooAdd(foo); // add one to object value
TestTimeManager timeManager = new TestTimeManager();
ScheduledFuture schedule1 = timeManager.schedule(runnable, 1, TimeUnit.SECONDS);
ScheduledFuture schedule2 = timeManager.schedule(runnable, 2, TimeUnit.SECONDS);
ScheduledFuture schedule3 = timeManager.schedule(runnable, 3, TimeUnit.SECONDS);
ScheduledFuture schedule4 = timeManager.schedule(runnable, 5, TimeUnit.SECONDS);
timeManager.hackIntoFuture(4,TimeUnit.SECONDS);
assertEquals(3,foo.getA());
assertTrue(schedule1.isDone());
assertTrue(schedule2.isDone());
assertTrue(schedule3.isDone());
assertFalse(schedule4.isDone());
}
// Sam test i nazwy są tymczasowe, na potrzeby pokazania idei
Wszystko opierało by się na (póki co) prostym interface
public interface TimeManager {
LocalDateTime now();
ScheduledFuture schedule(Runnable runnable, long l, TimeUnit timeUnit);
}
//Ponownie nazwy umowne
W logice aplikacji byłaby używana zwykła implementacja, która prawdopodobnie byłaby nakładką na javowe now i Scheduler, ale po przez ten interface, łatwo w testach podmienić na tę pokazaną
Czy w ogóle jest sens się za to zabierać? Jakieś ewentualne jeszcze pomysły odnośnie rzeczy która ta biblioteka mogłaby robić?