개요
보통 단위 테스트에서 의존 객체의 메서드 호출을 검증하기 위해 verify(), BDDMockito.then() 메서드를 사용한다.
의존 객체의 메서드 호출 여부외에도 호출 시 전달된 인자까지 검증하고 싶어 찾아보다가, ArgumenetCaptor라는 것을 알게되었다.
ArguementCaptor란?
Mockito에서 제공하는 테스트 유틸리티로 모킹된 객체의 메서드 호출될 때 전달된 인자를 캡처(capture)하여, 테스트 코드 내에서 해당 인자를 검증할 수 있게 하는 기능이다.
이를 통해, 단순히 메서드 호출 여부뿐만 아니라, 호출 시점에 어떤 인자가 전달되었는지에 대해 검증할 수 있다.
ArguementCaptor 적용 코드
- ArgumentCaptor.forClass(User.class)를 통해 캡처하고자 하는 타입의 ArgumentCaptor 인스터스트 생성한다.
- captor.capture()를 통해 모킹된 메서드 호출 시 실제 전달 된 인자를 캡처한다.
- captor.getValue()로 전달된 인자를 꺼내 내부 필드 값 등을 검증한다.
@InjectMocks
private UserService sut;
@Mock
private UserRepository userRepository;
@Test
void testCreateUser() {
// Given
String userId = "user1";
ArgumentCaptor<User> captor = ArgumentCaptor.forClass(User.class);
// When
userService.createUser(userId);
// Then
then(userRepository).should(time(1)).save(captor.capture());
User savedUser = captor.getValue();
assertThat(savedUser.getUsername()).isEqualTo(userId);
}
마무리
나는 그동안 모킹 객체 메서드의 호출 인자를 직접 검증하지 못해, 단순 호출 여부만 테스트했었다.
then(userRepository).should(time(1)).save(any(User.class));
이 방식은 메서드가 호출되는지만 검증할 뿐, 호출된 인자의 구체적인 값이 올바른지 확인할 수 없었다.
ArgumentCaptor를 활용하면 메서드에 전달된 인자의 구체적인 값까지 검증할 수 있어, 보다 견고한 테스트 코드를 작성할 수 있게 되었다.
'Programming > Spring' 카테고리의 다른 글
| [Spring] Spring MVC에서 Pageable 파라미터가 동작하는 방식 (1) | 2025.09.16 |
|---|---|
| [Spring Security] SecurityFilterChain 동작 분석 - Logout 요청 시 AuthenticationEntryPoint 미호출 문제 (3) | 2025.08.13 |
| [Spring 테스트] 테스트 간 데이터 충돌 문제 해결(@Sql 이해) (0) | 2025.07.11 |
| [JPA] 실전! 스프링 부트와 JPA 활용2 강의 핵심 내용 정리 (0) | 2025.07.01 |
| [JPA] 실전! 스프링 부트와 JPA 활용1 강의 핵심 내용 정리 (1) | 2025.06.06 |