Насмешка над методами Void с помощью Mockito

1. Обзор

В этом коротком руководстве мы сосредоточимся на имитации методов void с помощью Mockito.

Как и в других статьях, посвященных фреймворку Mockito (например, Mockito Verify, Mockito When / Then и Mockito's Mock Methods), показанный ниже класс MyList будет использоваться в качестве соавтора в тестовых примерах .

Мы добавим новый метод для этого урока:

public class MyList extends AbstractList { @Override public void add(int index, String element) { // no-op } }

2. Простая фиксация и проверка

Недействительные методы могут быть использованы с Mockito в doNothing () , doThrow () , и doAnswer () методы, делая насмешки и проверочные интуитивное:

@Test public void whenAddCalledVerified() { MyList myList = mock(MyList.class); doNothing().when(myList).add(isA(Integer.class), isA(String.class)); myList.add(0, ""); verify(myList, times(1)).add(0, ""); }

Однако doNothing () является поведением Mockito по умолчанию для методов void .

Эта версия whenAddCalledVerified () выполняет то же самое, что и предыдущая :

@Test public void whenAddCalledVerified() { MyList myList = mock(MyList.class); myList(0, ""); verify(myList, times(1)).add(0, ""); } 

DoThrow () генерирует исключение:

@Test(expected = Exception.class) public void givenNull_AddThrows() { MyList myList = mock(MyList.class); doThrow().when(myList).add(isA(Integer.class), isNull()); myList.add(0, null); } 

Мы рассмотрим doAnswer () ниже.

3. Захват аргумента

Одна из причин переопределить поведение по умолчанию с помощью doNothing () - это захват аргументов.

В приведенном выше примере мы использовали метод verify () для проверки аргументов, переданных в add () .

Однако нам может потребоваться зафиксировать аргументы и сделать с ними что-то еще.

В этих случаях мы используем doNothing () так же, как и выше, но с ArgumentCaptor :

@Test public void whenAddCalledValueCaptured() { MyList myList = mock(MyList.class); ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class); doNothing().when(myList).add(any(Integer.class), valueCapture.capture()); myList.add(0, "captured"); assertEquals("captured", valueCapture.getValue()); } 

4. Ответ на звонок Void

Метод может выполнять более сложное поведение, чем просто добавление или установка значения.

В таких ситуациях мы можем использовать Mockito в ответ , чтобы добавить поведение , нам нужно:

@Test public void whenAddCalledAnswered() { MyList myList = mock(MyList.class); doAnswer(invocation -> { Object arg0 = invocation.getArgument(0); Object arg1 = invocation.getArgument(1); assertEquals(3, arg0); assertEquals("answer me", arg1); return null; }).when(myList).add(any(Integer.class), any(String.class)); myList.add(3, "answer me"); } 

Как объясняется в разделе «Возможности Java 8» Mockito, мы используем лямбда-выражение с ответом для определения пользовательского поведения для add () .

5. Частичное издевательство

Также возможны частичные имитации. DoCallRealMethod () Mockito можно использовать для методов void :

@Test public void whenAddCalledRealMethodCalled() { MyList myList = mock(MyList.class); doCallRealMethod().when(myList).add(any(Integer.class), any(String.class)); myList.add(1, "real"); verify(myList, times(1)).add(1, "real"); } 

Таким образом, мы можем вызвать реальный метод и одновременно проверить его.

6. Заключение

В этой краткой статье мы рассмотрели четыре различных подхода к использованию методов void при тестировании с помощью Mockito.

Как всегда, примеры доступны в этом проекте GitHub.