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 예제를 확인할 수 있습니다.