Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

// following throws RuntimeException:
mockedList.clear();

Ответ 2

doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

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

Ответ 3

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

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

а затем вызовите оштукатуренную службу (или логику), например:

mockedList.clear();

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

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

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

Ответ 4

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

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

Ответ 5

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

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

тогда вы вызываете mockedList.clear(); mocked method будет генерировать исключение.

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

verify(mockedList, times(1)).clear(); 

Ответ 6

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

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

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