2009-08-02 12 views
6

C'è un modo per manipolare l'ora corrente in un test di jUnit 4.5? Ho il seguente metodo che mi piacerebbe avere una prova di unità permanipola l'ora corrente nel test dell'unità?

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); 
} 

Un modo per rendere più facile test è quello di dividerlo in due metodi

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); 
} 

che mi permette di testare la settimana sottrazione logica, ma lascia getLastWeek non testati e preferisco avere solo un metodo per questo.

+0

In alternativa, è solo un metodo, solo con due diversi elenchi di parametri :) – guerda

risposta

6

Non hai un vero modo di manipolare il tempo di sistema.

In realtà, hai rifattorizzato il metodo piuttosto bene per renderlo testabile. Lo terrei a questo.

3

Posso vedere due percorsi qui.

O creare una classe di fabbrica DateUtils che incapsula la costruzione delle istanze Calendar e Date. Quindi puoi scambiarlo con una fabbrica controllabile. Si, una seconda implementazione di DateUtils espone anche un metodo setCurrentTime e quindi restituirà esplicitamente le istanze Calendar impostate a tale data.

Oppure, è possibile utilizzare JMockit per "ridefinire" effettivamente la vostra chiamata di new GregorianCalendar, quindi viene restituita un'istanza di simulazione. Non l'ho fatto da solo, ma c'è una descrizione here.

L'opzione, suddividendo il metodo in due metodi, è anche un'opzione perfettamente valida. Penso che sia quello che fa la maggior parte delle persone, me compreso: ma la verità è che danneggia il tuo design, specialmente se la classe è esposta ad altri codici.

+0

I primi due suggerimenti, sebbene siano perfettamente validi e anche molto utilizzati in altre situazioni, si sentono un po 'eccessivo rispetto alle esigenze dell'OP. –

1

Sembra che tu stia cercando di ricreare cosa fa il tempo JODA. Lo citerò nel caso tu non lo sappia. Puoi fare il trade-off tra reinventare la ruota e aggiungere una dipendenza.

+0

Actully Ho trovato JODA oggi e ho capito che era quello che volevo veramente usare. Come apparirebbe una versione testabile di JODA? O dovrei semplicemente supporre che JODA funzioni correttamente come dovrebbe avere i propri test? –

+0

Controlla la sorgente JODA e controlla se è stata testata. Scommetto che lo è. Di solito presumo che una libreria di terze parti venga testata fino a quando non mi dà una ragione per credere altrimenti. Nel peggiore dei casi, hanno una base di utenti più ampia di te. Un sacco di gente che batte sul codice è un buon modo per trovare e sistemare molti errori. – duffymo

Problemi correlati