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 라이센스를 따릅니다.