Un enfoque que funciona mejor para las pruebas unitarias es abstraer la forma en que se accede a la hora actual en su código.
En lugar de llamar a System.currentTimeMillis() directamente, puede proporcionar su propia implementación.
Algo como esto (pseudo-código):
class MyTime {
private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl();
public setTimeInterface(TimeInterface timeInterface) {
CurrentTimeInterface = timeInterface;
}
public int getTime() { CurrentTimeInterface.getTime(); }
}
class DefaultTimeImpl implements TimeInterface {
public int getTime() { return System.currentTimeMillis(); }
}
class TestTimeImpl implements TimeInterface {
private int CurrentTimeMillis = 0;
public int getTime() { return CurrentTimeMillis; }
public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis}
public void sleep(int millis) { CurrentTimeMillis += millis; }
}
Entonces, en todas partes se habría llamado System.getTimeMillis() en lugar llamar MyTime.getTime(). Cuando estás probando tu código, simplemente crea TestTimeImpl y llama a MyTime.setTimeInterface (testTimeImpl). Luego, cuando desee tiempo para avanzar, llame a testTimeImpl.sleep() o testTimeImpl.setTime().
Esto le permite simular cualquier momento hasta el milisegundo.
¿El programa llama "hora" y "fecha" con la llamada al sistema? –
¿qué tal tener un script que configure el tiempo cada segundo un segundo aparte :) –
¿Este programa se basa en una base de datos o en cualquier otro programa externo? – jmucchiello