it-swarm.com.ru

Как смоделировать/протестировать метод, который возвращает void, возможно, в Mockito

Я столкнулся с проблемой, и я не могу найти элегантное решение.

Так что проблема в макете веб-драйвера Selenium, и я не знаю, как мне тестировать/макетировать пустые методы.

public void clickAndWait(String locator) {
    if(isElementPresent(locator) == false) throw some exception;
    Selenium.clickAndWait(); //a problematic delegating call to Selenium
}

Итак, я спрашиваю, как правильно протестировать такой метод, один тест был бы для исключения, но как правильно выполнить тест этого пустого метода, которому я делегирую?

17
Jarek

Следующий пример кода из этой документации Mockito иллюстрирует, как смоделировать пустой метод:

doThrow(new RuntimeException()).when(mockedList).clear();

// following throws RuntimeException:
mockedList.clear();
31
hoipolloi
doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            return null;
        }
    }).when(mock).method((SomeClass) anyObject());
21
Marcin Michalski

Предыдущие ответы были направлены на то, чтобы что-то делать (возможно, выбрасывать исключение) при каждом вызове. Таким образом, когда вы делаете что-то вроде:

doThrow(new RuntimeException()).when(mockedList).clear();

и затем вызовите заглушенный сервис (или логику) как:

mockedList.clear();

это сгенерирует исключение. Что, если вы хотите проверить правильность функционирования метода, возможно, написание положительного контрольного примера. Насмешка над методом возврата пустоты для такого случая может быть выполнена:

doNothing().when(mockedList).clear();

это означает, что, поскольку вы поставили метку на clear() для mockedList mock, вы можете быть уверены, что этот метод не повлияет на логику модуля, и все же вы можете проверить остальную часть потока, не создавая исключение.

10
Sourabh

Вы также можете использовать:

  • Метод Mockito.verify (mock/spy), чтобы проверить, сколько раз был вызван метод.
  • Или используйте аргумент captor , чтобы увидеть/проверить некоторые параметры, переданные в метод void.
1
jakcam

В Java 8 это можно сделать немного чище

doAnswer((i) -> {
  // Do stuff with i.getArguments() here
  return null;
}).when(*mock*).*method*(*methodArguments*);

return null; важен, и без него компиляция завершится с некоторыми довольно неясными ошибками, поскольку она не сможет найти подходящее переопределение для doAnswer.

0
Tim B

Вы можете создать исключение при вызове метода, вот небольшой пример, как это сделать: 

doThrow(new RuntimeException()).when(mockedList).clear();

тогда вы вызываете mockedList.clear();, метод mocked вызовет исключение.

Или вы можете подсчитать, сколько раз был вызван ваш метод, вот небольшой пример, как это сделать:

verify(mockedList, times(1)).clear(); 
0
Mindaugas Jaraminas