포스트

Spring Boot Test - Argument Captor

Mockito 라이브러리에서 제공하는 ArgumentCaptor는 테스트 코드에서 메서드 호출 시 전달된 인수를 캡처하고 검증하는데 사용되며 특정 메서드가 예상된 인수로 호출되었는지 확인할 수 있다. 그리고 다양한 레이어 테스트에서 사용 될 수 있다!


Service 테스트 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

    @InjectMocks private UserService userService;

    @Mock private UserRepository userRepository;

    // argument captor 생성
    @Captor private ArgumentCaptor<UserEntity> userCaptor;


    @Test
    public void testRegisterUser() {
        // given
        String name = "user gim";
        String email = "user.gim@email.mail";


        // when
        userService.registerUser(name, email);


        // then
        verify(userRepository).save(userCaptor.capture()); // save() 메서드에 전달 된 매개변수 캡처!
        
        UserEntity capturedUser = userCaptor.getValue();
        
        // 전달한 값과 비교 검증
        assertEquals(name, capturedUser.getName()); 
        assertEquals(email, capturedUser.getEmail());
    }
}


Controller 테스트 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@WebMvcTest(UserController.class)
public class UserControllerTest {

    @Autowired private MockMvc mockMvc;

    @MockBean private UserService userService;

    // argument captor 생성
    @Captor private ArgumentCaptor<String> nameCaptor;
    @Captor private ArgumentCaptor<String> emailCaptor;


    @Test
    public void testRegisterUser() throws Exception {
        // given
        String name = "user gim";
        String email = "user.gim@email.mail";


        // when
        mockMvc.perform(post("/users")
                      .param("name", name)
                      .param("email", email)
                )
                .andExpect(status().isOk());


        // then
        verify(userService).registerUser(
          // registerUser()에 전달 된 매개변수 캡처!
            nameCaptor.capture(), emailCaptor.capture() 
        );
        
        // 전달한 값과 비교 검증
        assertEquals(name, nameCaptor.getValue());
        assertEquals(email, emailCaptor.getValue());
    }
}




참고한 사이트

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.