Поиск по сайту:

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.