Как смоделировать / протестировать метод, который возвращает void, возможно, в Mockito - PullRequest
17 голосов
/ 17 июня 2011

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

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

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

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

Ответы [ 6 ]

31 голосов
/ 17 июня 2011

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

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

// following throws RuntimeException:
mockedList.clear();
21 голосов
/ 17 июня 2011
doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {

            return null;
        }
    }).when(mock).method((SomeClass) anyObject());
10 голосов
/ 16 июня 2014

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

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

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

mockedList.clear();

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

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

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

1 голос
/ 27 июня 2011

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

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

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

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

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

0 голосов
/ 18 апреля 2013

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

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

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

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

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