2009-08-02 6 views
6

Czy istnieje sposób na manipulowanie bieżącym czasem w teście jUnit 4.5? Mam następującą metodę, którą chciałbym mieć badanej jednostki namanipulować bieżącym czasem w testowaniu jednostkowym?

public String getLastWeek() { 
    GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm")); 
    c.setFirstDayOfWeek(GregorianCalendar.MONDAY); 
    c.add(GregorianCalendar.WEEK_OF_YEAR, -1); 
    return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR); 
} 

jeden sposób, aby ułatwić testowanie jest podzielić ją na dwa sposoby

public String getLastWeek() { 
    GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm")); 
    return getLastWeekFor(c); 
} 

public String getLastWeekFor(GregorianCalander c) { 
    c.setFirstDayOfWeek(GregorianCalendar.MONDAY); 
    c.add(GregorianCalendar.WEEK_OF_YEAR, -1); 
    return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR); 
} 

To pozwala mi testować logika odejmowania tygodni, ale test getLastWeek pozostawia nietestowany i wolę mieć tylko jedną metodę.

+0

Jest to tylko jedna metoda, tylko z dwiema różnymi listami parametrów :) – guerda

Odpowiedz

6

Nie masz realnego sposobu na manipulowanie czasem systemowym.

W rzeczywistości dość ładnie refaktoryzowano tę metodę, aby można było ją przetestować. Zatrzymałbym to na tym.

3

Widzę tu dwie ścieżki.

Należy utworzyć klasę fabryczną DateUtils, która obejmuje konstrukcje instancji Calendar i . Następnie możesz zamienić to na sterowaną fabrykę. Oznacza to, że masz drugą implementację DateUtils, która również ujawnia metodę setCurrentTime, a następnie jawnie zwróci instancje Calendar ustawione na tę datę.

Albo, możesz użyć JMockit do rzeczywistego "ponownego zdefiniowania" połączenia new GregorianCalendar, więc zamiast tego zwracana jest pozorowana instancja. Sam tego nie zrobiłem, ale istnieje opis: here.

Twoja opcja, dzieląc metodę na dwie metody, jest również całkowicie poprawną opcją. Myślę, że to właśnie robi większość ludzi - w tym ja: ale prawda jest taka, że ​​szkodzi to twojemu projektowi, zwłaszcza jeśli klasa jest wystawiona na działanie innego kodu.

+0

Pierwsze dwie sugestie, mimo że są całkowicie poprawne, a nawet bardzo często stosowane w innych sytuacjach, wydają się nieco przesadzone z potrzebami OP. –

1

Wygląda na to, że próbujesz odtworzyć, co zrobi JODA godzina. Zacytuję to na wypadek, gdybyś nie był tego świadomy. Możesz dokonać kompromisu między odkrywaniem koła a dodawaniem zależności.

+0

W zasadzie znalazłem JODA wcześniej i zdałem sobie sprawę, że właśnie tego chciałem użyć. Jak wyglądałaby możliwa do sprawdzenia wersja JODA? Czy powinienem po prostu założyć, że JODA działa poprawnie, ponieważ powinien mieć własne testy? –

+0

Sprawdź źródło JODA i sprawdź, czy urządzenie zostało przetestowane. Założę się, że tak. Zwykle zakładam, że trzecia biblioteka jest testowana, dopóki nie da mi powodów, aby sądzić, że jest inaczej. W najgorszym przypadku mają większą bazę użytkowników niż Ty. Wiele osób walczących z kodem jest dobrym sposobem na znalezienie i naprawienie wielu błędów. – duffymo