Ответ 1
Следующий пример кода из этой Документация Mockito иллюстрирует, как издеваться над методом void:
doThrow(new RuntimeException()).when(mockedList).clear();
// following throws RuntimeException:
mockedList.clear();
Я столкнулся с проблемой, и я не могу найти элегантное решение.
Итак, проблема заключается в макете веб-драйвера Selenium, и я не знаю, как я должен тестировать/издеваться над методами void.
public void clickAndWait(String locator) {
if(isElementPresent(locator) == false) throw some exception;
selenium.clickAndWait(); //a problematic delegating call to selenium
}
Итак, я спрашиваю, как правильно протестировать такой метод, один тест будет для того, чтобы исключение было брошено, но как правильно выполнить проверку этого метода void, который я делегирую?
Следующий пример кода из этой Документация Mockito иллюстрирует, как издеваться над методом void:
doThrow(new RuntimeException()).when(mockedList).clear();
// following throws RuntimeException:
mockedList.clear();
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
return null;
}
}).when(mock).method((SomeClass) anyObject());
В предыдущих ответах подчеркивалось, что он делает что-то (бросая исключение) при каждом вызове. Таким образом, когда вы делаете что-то вроде:
doThrow(new RuntimeException()).when(mockedList).clear();
а затем вызовите оштукатуренную службу (или логику), например:
mockedList.clear();
он генерирует исключение. Что делать, если вы хотите проверить правильность функционирования метода, возможно, написать положительный тестовый пример. Вымывание метода возврата пустоты для такого случая может быть выполнено с помощью:
doNothing().when(mockedList).clear();
что означает, что, поскольку вы наложили clear()
метод на mockedList
mock, вы можете быть уверены, что этот метод не будет влиять на логику устройства, и вы можете проверить остальную часть потока без создания исключение.
Вы также можете использовать:
Вы можете вызвать исключение в вызове метода, вот небольшой пример, как это сделать:
doThrow(new RuntimeException()).when(mockedList).clear();
тогда вы вызываете mockedList.clear();
mocked method будет генерировать исключение.
Или вы можете подсчитать, сколько раз ваш метод был вызван, вот небольшой пример, как это сделать:
verify(mockedList, times(1)).clear();
В Java 8 это можно сделать немного чище
doAnswer((i) -> {
// Do stuff with i.getArguments() here
return null;
}).when(*mock*).*method*(*methodArguments*);
return null;
важен, и без него компиляция завершится неудачно с некоторыми довольно неясными ошибками, так как не сможет найти подходящее переопределение для doAnswer
.