웹사이트 검색

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;

Mockito 프레임워크에 의해 초기화되도록 테스트 메서드 전에 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());
	}
}

GitHub 리포지토리에서 전체 코드와 더 많은 Mockito 예제를 확인할 수 있습니다.