1. Обзор
В этом коротком руководстве мы сосредоточимся на имитации методов void
с помощью Mockito.
Как и в других статьях, посвященных платформе Mockito (например, Mockito Verify , Mockito When/Then и Mock Methods Mockito
), класс MyList, показанный ниже, будет использоваться в качестве соавтора в тестовых примерах.
Мы добавим новый метод для этого руководства:
public class MyList extends AbstractList<String> {
@Override
public void add(int index, String element) {
// no-op
}
}
2. Простая насмешка и проверка
Методы Void
можно использовать с методами 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<String> valueCapture = ArgumentCaptor.forClass(String.class);
doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
myList.add(0, "captured");
assertEquals("captured", valueCapture.getValue());
}
4. Ответ на призыв к пустоте
Метод может выполнять более сложное поведение, чем просто добавление или установка значения.
В этих ситуациях мы можем использовать ответ 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");
}
Как объяснялось в Mockito’s Java 8 Features , мы используем лямбда с ответом
, чтобы определить собственное поведение для 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 .