Tuve un problema similar recientemente con el código que no pude refactorizar demasiado (limitaciones de tiempo, no quería romper inadvertidamente nada). Tenía un método que quería probar que llamaba System.currentTimeMillis() y el caso que quería probar dependería de lo que devolviera ese valor. Algo así como:
public class ClassINeedToTest {
public boolean doStuff() {
long l = System.currentTimeMillis();
// do some calculation based on l
// and return the calculation
}
}
Para permitir que la unidad de pruebas, que refactorizado la clase así que tenía un método de ayuda que estaba protegida
protected long getCurrentTimeMillis() {
// only for unit-testing purposes
return System.currentTimeMillis();
}
y este método fue llamado por hacerTarea(). Esto no cambia la funcionalidad pero ahora significaba que cuando lo llamo en la unidad de prueba, podría entonces anular este para devolver un valor específico, como
ClassINeedToTest testClass = new ClassINeedToTest() {
protected long getCurrentTimeMillis() {
// return specific date for my test
return 12456778L;
}
};
boolean result = testClass.doStuff();
// test result with an assert here
Esto significa sin embargo que he contaminado el interfaz de mi clase, por lo que puede decidir que el costo es demasiado alto. Probablemente haya mejores formas si puede refactorizar el código más.
cambie su método para que de hecho le dé la hora como parámetro, luego puede probar dando el tiempo que desee. ¿Qué habla contra esto? – belgther
¿Puede decirnos cómo obtiene la fecha y hora actuales? Tal vez la burla funcionaría ... –
Por ahora solo con 'new Date()', tal vez necesite una clase TimeProvider – Alex