Questo è quello che sto usando. L'ho trovato nel libro: Test Driven - TDD pratico e TDD di accettazione per gli sviluppatori Java di Lasse Koskela.
public interface TimeSource {
long millis();
}
public class SystemTime {
private static TimeSource source = null;
private static final TimeSource DEFAULTSRC =
new TimeSource() {
public long millis() {
return System.currentTimeMillis();
}
};
private static TimeSource getTimeSource() {
TimeSource answer;
if (source == null) {
answer = DEFAULTSRC;
} else {
answer = source;
}
return answer;
}
public static void setTimeSource(final TimeSource timeSource) {
SystemTime.source = timeSource;
}
public static void reset() {
setTimeSource(null);
}
public static long asMillis() {
return getTimeSource().millis();
}
public static Date asDate() {
return new Date(asMillis());
}
}
Si noti che la fonte di tempo predefinito, DEFAULTSRC, è System.currentTimeMillis(). È sostituito nei test unitari; tuttavia, il normale comportamento è il tempo di sistema standard.
Questo è dove viene utilizzato:
public class SimHengstler {
private long lastTime = 0;
public SimHengstler() {
lastTime = SystemTime.asMillis(); //System.currentTimeMillis();
}
}
E qui è la prova di unità:
import com.company.timing.SystemTime;
import com.company.timing.TimeSource;
public class SimHengstlerTest {
@After
public void tearDown() {
SystemTime.reset();
}
@Test
public final void testComputeAccel() {
// Setup
setStartTime();
SimHengstler instance = new SimHengstler();
setEndTime(1020L);
}
private void setStartTime() {
final long fakeStartTime = 1000L;
SystemTime.setTimeSource(new TimeSource() {
public long millis() {
return fakeStartTime;
}
});
}
private void setEndTime(final long t) {
final long fakeEndTime = t; // 20 millisecond time difference
SystemTime.setTimeSource(new TimeSource() {
public long millis() {
return fakeEndTime;
}
});
}
Nel test di unità, ho sostituito il TimeSource con solo un numero che è stato fissato a 1000 millisecondi. Questo servirà come orario di partenza. Quando si chiama setEndTime(), inserisco 1020 millisecondi per il tempo di completamento. Questo mi ha dato una differenza di tempo controllata di 20 millisecondi.
Non c'è alcun codice di test nel codice di produzione, solo per ottenere il normale orario di sistema.
Assicurarsi di chiamare reset dopo il test per tornare a utilizzare il metodo orario del sistema anziché il tempo falso.
fonte
2009-05-19 22:29:18
Sì, che una sorta di doppia spedizione (credo?) sarebbe l'approccio ideale, peccato che .NET non riesca a farlo. A volte faccio scorrere la mia interfaccia del timer, ma mi sento sempre come se stessi introducendo la complessità. –
Suona più come un'iniezione di dipendenza che una doppia spedizione. –
Minore problema di terminologia, ma penso che sia corretto chiamare questo doppio invio o visitatore.È sicuro, ma stai anche prendendo un oggetto e dicendo di applicare la sua politica di aggiornamento a "questo". –