Esto es lo que estoy usando. Lo encontré en el libro: Test Driven - Práctico TDD y aceptación TDD para Java Desarrolladores por 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());
}
}
en cuenta que la fuente de tiempo predeterminado, DEFAULTSRC, es System.currentTimeMillis(). Se reemplaza en pruebas unitarias; sin embargo, el comportamiento normal es el tiempo estándar del sistema.
Aquí es donde se utiliza:
public class SimHengstler {
private long lastTime = 0;
public SimHengstler() {
lastTime = SystemTime.asMillis(); //System.currentTimeMillis();
}
}
Y aquí está la prueba de unidad:
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;
}
});
}
En la prueba de unidad, que sustituyó a la TimeSource con sólo un número que fue establecido en 1000 milisegundos. Eso servirá como la hora de inicio. Al llamar a setEndTime(), ingreso 1020 milisegundos para el tiempo de finalización. Esto me dio una diferencia de tiempo controlada de 20 milisegundos.
No hay código de prueba en el código de producción, solo se obtiene el tiempo de sistema normal.
Asegúrese de llamar a restablecer después de la prueba para volver a utilizar el método de tiempo del sistema en lugar del tiempo falso.
Sí, ese tipo de despacho doble (¿no es así?) sería el enfoque ideal, lástima .NET lo convierte en una molestia para hacer esto. En ocasiones, hago rodar mi propia interfaz de temporizador, pero siempre siento que estoy introduciendo complejidad. –
Suena más como una inyección de dependencia que un doble despacho para mí. –
Pequeña objeción de terminología, pero creo que es correcto llamar a esto envío doble o visitante.Está seguro, pero también está tomando un objeto y diciéndole que aplique su política de actualización a 'esto'. –