Tengo una clase de observador de archivos muy simple que comprueba cada 2 segundos si un archivo ha cambiado y si es así, se llama al método onChange
(void). ¿Existe alguna manera fácil de verificar si se llama al método onChange
en una prueba unitaria?JUnit: comprobando si se llama un método nulo
código:
public class PropertyFileWatcher extends TimerTask {
private long timeStamp;
private File file;
public PropertyFileWatcher(File file) {
this.file = file;
this.timeStamp = file.lastModified();
}
public final void run() {
long timeStamp = file.lastModified();
if (this.timeStamp != timeStamp) {
this.timeStamp = timeStamp;
onChange(file);
}
}
protected void onChange(File file) {
System.out.println("Property file has changed");
}
}
prueba:
@Test
public void testPropertyFileWatcher() throws Exception {
File file = new File("testfile");
file.createNewFile();
PropertyFileWatcher propertyFileWatcher = new PropertyFileWatcher(file);
Timer timer = new Timer();
timer.schedule(propertyFileWatcher, 2000);
FileWriter fw = new FileWriter(file);
fw.write("blah");
fw.close();
Thread.sleep(8000);
// check if propertyFileWatcher.onChange was called
file.delete();
}
Puede utilizar cualquier marco de burla y no solo mockito. Eche un vistazo a EasyMock o jMock y elija lo que desee. La regla práctica de escribir pruebas unitarias es que solo debe burlarse de los objetos que puede controlar. En otras palabras, los objetos simulados deben estar disponibles para la clase en prueba usando argumentos/parámetros del constructor o parámetros para su método bajo prueba. Según esta lógica, no puede simular invocaciones estáticas, objetos finales o privados o "nuevos" creados dentro del método de la clase bajo prueba. – Kartik
¿Alguna idea de cómo puedes hacerlo en EasyMock? Encuentro que la documentación falta en esto. Cuando creo un simulacro para PropertyFileWatcher de esta manera: PropertyFileWatcher propertyFileWatcher = createMockBuilder (PropertyFileWatcher.class) .withConstructor (file) .createMock(); y grabar la llamada esperada en onChange y reproducir: propertyFileWatcher.onChange (archivo); reproducir (propertyFileWatcher); el método onChnage se llama de inmediato y la información se imprime en sysout, pero solo me gustaría verificar si se llamó o no ese método – nkr1pt
No utilice mockito para poder hacer la solución AtomicBoolean. –