У меня очень простой класс наблюдателя файлов, который проверяет каждые 2 секунды, если файл был изменен, и если да, то вызывается метод onChange
(void). Есть ли простой способ проверить, вызван ли метод onChange
в модульном тесте?JUnit: проверка, вызван ли метод void
код:
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
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();
}
Вы можете использовать любые издевательские рамки, а не только mockito. Взгляните на EasyMock или jMock и выберите то, что вам нравится. Эмпирическое правило написания модульных тестов заключается в том, что вы должны только издеваться над объектами, которыми вы можете управлять. Другими словами, объекты-макеты должны быть доступны тестируемому классу с использованием аргументов/параметров или параметров конструктора для вашего тестируемого метода. По этой логике вы не можете высмеивать статические вызовы, конечные или частные или «новые» объекты, созданные внутри метода тестируемого класса. – Kartik
Любая идея, как вы можете это сделать в EasyMock? Я не вижу в документации документации. Когда я создаю макет для PropertyFileWatcher следующим образом: PropertyFileWatcher propertyFileWatcher = createMockBuilder (PropertyFileWatcher.class) .withConstructor (файл) .createMock(); и записать ожидаемый вызов onChange и повторить: propertyFileWatcher.onChange (файл); Повтор (propertyFileWatcher); метод onChnage вызывается сразу, а информация печатается в sysout, но я просто хотел бы подтвердить, что этот метод был вызван или нет. – nkr1pt
Не используйте mockito для выполнения решения AtomicBoolean. –