2010-05-11 4 views
9

У меня очень простой класс наблюдателя файлов, который проверяет каждые 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(); 
} 

ответ

16

С Mockito, вы можете проверить, является ли метод вызывается по крайней мере один раз/никогда.

См пункт 4 в this page

например:

verify(mockedObject, times(1)).onChange(); // times(1) is the default and can be omitted 
+0

Вы можете использовать любые издевательские рамки, а не только mockito. Взгляните на EasyMock или jMock и выберите то, что вам нравится. Эмпирическое правило написания модульных тестов заключается в том, что вы должны только издеваться над объектами, которыми вы можете управлять. Другими словами, объекты-макеты должны быть доступны тестируемому классу с использованием аргументов/параметров или параметров конструктора для вашего тестируемого метода. По этой логике вы не можете высмеивать статические вызовы, конечные или частные или «новые» объекты, созданные внутри метода тестируемого класса. – Kartik

+0

Любая идея, как вы можете это сделать в EasyMock? Я не вижу в документации документации. Когда я создаю макет для PropertyFileWatcher следующим образом: PropertyFileWatcher propertyFileWatcher = createMockBuilder (PropertyFileWatcher.class) .withConstructor (файл) .createMock(); и записать ожидаемый вызов onChange и повторить: propertyFileWatcher.onChange (файл); Повтор (propertyFileWatcher); метод onChnage вызывается сразу, а информация печатается в sysout, но я просто хотел бы подтвердить, что этот метод был вызван или нет. – nkr1pt

+0

Не используйте mockito для выполнения решения AtomicBoolean. –

4

Как я понимаю, ваш PropertyFileWatcher предназначен для подклассов. Итак, почему бы не подклассифицировать это так:

class TestPropertyFileWatcher extends PropertyFileWatcher 
{ 
    boolean called = false; 
    protected void onChange(File file) { 
     called = true; 
    } 
} 

... 
TestPropertyFileWatcher watcher = new TestPropertyFileWatcher 
... 
assertTrue(watcher.called); 
7

Вот простая модификация для вашего теста.

@Test 
public void testPropertyFileWatcher() throws Exception { 
    final File file = new File("testfile"); 
    file.createNewFile(); 

    final AtomicBoolean hasCalled = new AtomicBoolean(); 
    PropertyFileWatcher propertyFileWatcher = 
     new PropertyFileWatcher(file) 
     { 
     protected void onChange (final File localFile) 
     { 
      hasCalled.set(true); 
      assertEquals(file, localFile); 
     } 
     } 


    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 

    assertTrue(hasCalled.get()); 
    file.delete(); 
} 
+0

Мне действительно нравится это решение, потому что оно не добавляет зависимости к насмешливой структуре; однако издевательские рамки необходимы для модульного тестирования; поэтому я принимаю насмешливое предложение как принятый ответ на мой вопрос. – nkr1pt

+0

@ nkr1pt. Определенно идут с уважаемой насмешливой структурой. Если вы не ограничены версией JDK 1.4, взгляните на jMock. –

Смежные вопросы