Mockito ArgumentCaptor, аннотация @Captor
Mockito ArgumentCaptor используется для захвата аргументов для имитируемых методов. ArgumentCaptor используется с утверждениями JUnit для наших тестов.
Mockito ArgumentCaptor
Мы можем создать экземпляр ArgumentCaptor
для любого класса, затем его метод capture()
используется с методами verify()
. Наконец, мы можем получить захваченные аргументы из методов getValue()
и getAllValues()
. Метод getValue()
можно использовать, когда мы захватили один аргумент. Если проверенный метод вызывался несколько раз, метод getValue()
вернет последнее захваченное значение. Если захвачено несколько аргументов, вызовите getAllValues()
, чтобы получить список аргументов.
Пример 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
Мы можем использовать аннотацию @Captor
для создания перехватчика аргументов на уровне поля. Таким образом, вместо того, чтобы инициализировать уровень поля ArgumentCaptor как:
ArgumentCaptor acLong = ArgumentCaptor.forClass(Long.class);
Мы можем использовать @Captor как:
@Captor ArgumentCaptor acLong;
Обратите внимание, что мы должны вызвать MockitoAnnotations.initMocks(this);
перед методами тестирования, чтобы инициализировать его фреймворком 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());
}
}
Вы можете ознакомиться с полным кодом и другими примерами Mockito в нашем репозитории GitHub.