Автор оригинала: Pankaj Kumar.
Mockito ArgumentCaptor используется для захвата аргументов для издевательских методов. ArgumentCaptor используется с методами Mockito verify() для передачи аргументов при вызове любого метода. Таким образом, мы можем предоставить дополнительные утверждения JUnit для наших тестов.
Ловец аргументов Mockito
Мы можем создать экземпляр ArgumentCaptor для любого класса, затем его метод capture() используется с методами verify () .
Наконец, мы можем получить захваченные аргументы из методов GetValue() и getvalues () .
Метод GetValue() может использоваться, когда мы захватили один аргумент. Если проверенный метод вызывался несколько раз, то GetValue() метод вернет последнее полученное значение.
Если захвачено несколько аргументов, вызовите get All Values () , чтобы получить список аргументов.
Пример Mockito ArgumentCaptor
Допустим, у нас есть класс, определенный как:
class MathUtils {
public int add(int x, int y) {
return x + y;
}
public boolean isInteger(String s) {
try {
Integer.parseInt(s);
} catch (NumberFormatException e) {
return false;
}
return true;
}
public long squareLong(long l) {
return l*l;
}
}
Мы можем написать наш тестовый пример и использовать ArgumentCaptor, как показано ниже.
@Test
void test() {
MathUtils mockMathUtils = mock(MathUtils.class);
when(mockMathUtils.add(1, 1)).thenReturn(2);
when(mockMathUtils.isInteger(anyString())).thenReturn(true);
ArgumentCaptor acInteger = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor acString = ArgumentCaptor.forClass(String.class);
assertEquals(2, mockMathUtils.add(1, 1));
assertTrue(mockMathUtils.isInteger("1"));
assertTrue(mockMathUtils.isInteger("999"));
verify(mockMathUtils).add(acInteger.capture(), acInteger.capture());
List allValues = acInteger.getAllValues();
assertEquals(List.of(1, 1), allValues);
verify(mockMathUtils, times(2)).isInteger(acString.capture());
List allStringValues = acString.getAllValues();
assertEquals(List.of("1", "999"), allStringValues);
}
Мокито @Похититель
Мы можем использовать @Captor аннотацию для создания argumentcaptor на уровне поля. Поэтому вместо инициализации ArgumentCaptor уровня поля как:
ArgumentCaptoracLong = ArgumentCaptor.forClass(Long.class);
Мы можем использовать @Captor в качестве:
@Captor ArgumentCaptoracLong;
Обратите внимание, что мы должны вызвать MockitoAnnotations.initMocks(это); перед методами тестирования, чтобы он был инициализирован платформой Mockito.
Пример Mockito @Captor
Вот простой пример аннотации @Captor.
class MockitoArgumentCaptorExamples {
@Captor ArgumentCaptor acLong;
@Test
void test() {
MathUtils mockMathUtils = mock(MathUtils.class);
when(mockMathUtils.squareLong(2L)).thenReturn(4L);
assertEquals(4L, mockMathUtils.squareLong(2L));
verify(mockMathUtils).squareLong(acLong.capture());
assertTrue(2 == acLong.getValue());
}
}