J'ai une classe de surveillance de fichiers très simple qui vérifie toutes les 2 secondes si un fichier a changé et si oui, la méthode onChange
(void) est appelée. Existe-t-il un moyen facile de vérifier si la méthode onChange
est appelée dans un test unitaire?JUnit: vérifier si une méthode void est appelée
code:
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");
}
}
Test:
@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();
}
Vous pouvez utiliser n'importe quel cadre de simulation et pas seulement mockito. Jetez un oeil à EasyMock ou jMock et choisissez ce que vous aimez. La règle de base de l'écriture des tests unitaires est que vous ne devez que simuler les objets que vous pouvez contrôler. En d'autres termes, les objets fantaisie doivent être mis à la disposition de la classe testée en utilisant des arguments constructeurs ou des paramètres de votre méthode testée. Par cette logique, vous ne pouvez pas vous moquer des invocations statiques, finales ou privées, ou des «nouveaux» objets créés à l'intérieur de la méthode de la classe testée. – Kartik
Une idée de comment vous pouvez le faire dans EasyMock? Je trouve que la documentation manque à ce sujet. Lorsque je crée un simulacre pour PropertyFileWatcher comme ceci: PropertyFileWatcher propertyFileWatcher = createMockBuilder (PropertyFileWatcher.class) .withConstructor (fichier) .createMock(); et enregistrer l'appel attendu à onChange et rejouer: propertyFileWatcher.onChange (file); replay (propertyFileWatcher); la méthode onChnage est appelée immédiatement et info est imprimée à sysout, mais je voudrais juste vérifier si cette méthode a été appelée ou non – nkr1pt
Ne pas utiliser mockito étant capable de faire la solution AtomicBoolean. –