La radice del problema è che l'orologio di sistema (cosa ti dà il tempo in un new Date()
) non ti dà il tempo necessario per il test.
È possibile evitare questo problema introducendo un livello di riferimento indiretto. Invece di fare in modo che il tuo codice chieda direttamente all'API Java qual è l'ora corrente, hai il tuo codice chiedere a un oggetto Clock
quale è l'ora. Nel programma reale l'implementazione Clock
utilizza l'orologio di sistema. Per i tuoi test unitari usi un FakeClock
, che dice a qualunque ora tu voglia. Dì al tuo codice cosa usare Clock
usando l'iniezione di dipendenza . Devi scrivere tu stesso l'interfaccia Clock
(o classe base astratta) e le sue implementazioni concrete.
Questo approccio richiede di modificare il codice esistente, quindi è più facile da testare o scrivere in primo luogo, quindi è più facile da testare. È uno dei trucchi dei test unitari.
Sto lavorando su un codice al momento sensibile al tempo. La mia interfaccia di clock è semplicemente
public interface Clock {
long getCurrentTime();
}
Puoi mostrarci la fonte dei tuoi test unitari? – tbsalling
Non ho bisogno di usare alcun framwork. Ho solo 3 compiti uno dopo l'altro come tre metodi calls.f1() -> f2() -> f3(). f2 può essere fatto domani e quindi nel risultato verrà chiamato f3. – hi5
Vedere anche http://stackoverflow.com/questions/10652097/simulating-the-passing-of-time-in-unittesting – Raedwald