🎯 Mockito @Captor 애노테이션 정리
- 호출된 메서드의 인자를 캡처하고 검증하는 도구
✅ 1. @Captor란?
@Captor는 Mockito에서 메서드가 호출될 때 전달된 인자(argument)를 캡처하기 위한 어노테이션입니다.
내부적으로는 ArgumentCaptor<T> 객체를 생성해주며, 테스트 대상이 호출한 메서드의 인자를 검증할 수 있게 해줍니다.
💡 왜 사용하나요?
- 단순히 verify()만으로는 인자 값이 무엇이었는지 정확히 확인하기 어려움
- 테스트 대상 내부에서 만들어진 객체를 외부로 전달할 때 그 전달된 객체의 필드 값을 검증하고 싶을 때 사용
🧩 2. 기본 사용 방법
📌 의존성 (Gradle 기준)
dependencies {
testImplementation 'org.mockito:mockito-core'
testImplementation 'org.mockito:mockito-junit-jupiter' // JUnit 5 사용 시
}
📌 예제 코드
@ExtendWith(MockitoExtension.class)
class MemberServiceTest {
@Mock
private MemberRepository memberRepository;
@InjectMocks
private MemberService memberService;
@Captor
private ArgumentCaptor<Member> memberCaptor;
@Test
void 회원가입_테스트() {
// when
memberService.join("철수");
// then
verify(memberRepository).save(memberCaptor.capture());
Member captured = memberCaptor.getValue();
assertEquals("철수", captured.getName());
}
}
🧠 흐름 요약
- memberService.join("철수") 호출
- 내부적으로 memberRepository.save(new Member("철수")) 실행
- verify()로 save()가 호출됐는지 확인
- @Captor로 넘겨진 인자(Member)를 꺼내서 검증
🔍 @Captor vs ArgumentCaptor.forClass(...)
방식 | 설명 |
@Captor | 선언만 해두면 Mockito가 자동으로 초기화 |
ArgumentCaptor.forClass() | 직접 객체 생성 (더 번거로움) |
// 수동 방식
ArgumentCaptor<Member> captor = ArgumentCaptor.forClass(Member.class);
verify(repo).save(captor.capture());
✅ 가독성과 유지보수 면에서는 @Captor 방식이 더 선호됨
⚠️ 사용 시 주의사항
항목 | 설명 |
@Captor 초기화 | @ExtendWith(MockitoExtension.class) 또는 MockitoAnnotations.openMocks(this) 필요 |
제네릭 타입 명확히 지정 | ArgumentCaptor<List<String>>처럼 사용할 때는 타입 명확히 작성 필요 |
capture()는 verify()와 함께 | verify(mock).method(captor.capture()) 형태로 같이 사용해야 함 |
🧪 실전 상황 예시: 이벤트 발행 여부 검증
@Captor
ArgumentCaptor<Event> eventCaptor;
@Test
void 이벤트_검증() {
service.doSomething();
verify(eventPublisher).publish(eventCaptor.capture());
Event captured = eventCaptor.getValue();
assertEquals("SOME_TYPE", captured.getType());
}
✔ 서비스 내부에서 정확한 이벤트가 발행되었는지 확인할 수 있음
✅ 마무리 정리
항목 | 설명 |
어노테이션 | @Captor |
제공자 | Mockito |
목적 | 메서드 호출 시 전달된 인자 캡처 및 검증 |
내부 객체 | ArgumentCaptor<T> |
초기화 방법 | MockitoExtension or openMocks() 필요 |
사용 위치 | @Mock, @InjectMocks와 함께 사용하는 테스트 클래스 내부 |
@Captor는 단순히 메서드 호출을 "했는가"를 넘어서
"무엇을" 호출했는지를 정밀하게 검증하는 데 필수적인 도구입니다.
특히 객체 생성 후 전달하는 로직이 많은 도메인에서는 매우 유용하게 쓰입니다. 😊
'방법론 > Test' 카테고리의 다른 글
ReflectionTestUtils (2) | 2025.07.16 |
---|