Если во время разработки некоторые зависимые интерфейсы еще не разработаны и некоторые интерфейсы невозможно настроить, вы можете использовать Mockito для макетирования интерфейсов, а затем протестировать логику, что очень легко использовать.
В недавней разработке я использовал метод Mock для типов возвращаемых значений void. Я увидел хорошую статью и перевел ее, надеюсь, она будет полезна всем.
-------------------------------------------------- -----Великолепная разделительная линия------------------------------------------ ---------------
Основное содержание этой статьи — использование Mockito для имитации методов без возвращаемых значений.
Ниже приведен класс, подготовленный к тестированию.
public class MyList extends AbstractList {
@Override
public void add(int index, String element) {
// no-op
}
}
доступный MockitoизdoNothing(), doThrow() и doAnswer(). Для имитации и проверки функций без возвращаемых значений.
@Test
public void whenAddCalledVerfied() {
MyList myList = mock(MyList.class);
doNothing().when(myList).add(isA(Integer.class), isA(String.class));
myList.add(0, "");
verify(myList, times(1)).add(0, "");
}
Однако вMockitoсерединаdoNothing() Это поведение по умолчанию для имитирующих методов без возвращаемых значений.
Следующий код эквивалентен приведенному выше
@Test
public void whenAddCalledVerfied() {
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()
переписатьdoNothing() Важной причиной такого поведения по умолчанию является получение параметров.
Как в примере из части 2,проходить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());
}
Метод может быть чем-то большим, чем просто добавление значения. Это когда вам нужно использовать Answer класс, чтобы добавить другие нужные нам варианты поведения.
@Test
public void whenAddCalledAnswered() {
MyList myList = mock(MyList.class);
doAnswer((Answer) 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изdoCallRealMethod() Метод доступен для функции 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");
}
Эта функция позволяет нам вызывать фактические методы исходного объекта, а также вызывать проверку.
В этой статье представлены четыре метода в Mockito для имитации функций, возвращающих значения void.
Оригинальный текст на английском языке:https://www.baeldung.com/mockito-void-methods
исходный код:https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito