[Spring] Mock 객체의 메소드 파라미터가 객체일 때 when 적용 안됨
문제 상황
로그인 테스트 코드에서 Mockito로 설정한 Service 객체의 메소드에서 파라미터를 정상적인 값을 넣어줬음에도 thenReturn()으로
설정한 원하는 결과가 나오지 않았다. 계속 null이 반환됐는데 로그를 찍어보면서 파라미터가 원인이라는 것을 알 수 있었다.
파라미터에 primitive type 및 String은 when().thenReturn()이 정상적으로 처리되는걸 확인했으나,
객체가 들어가는 경우에만 설정해준 when()이 적용되지 않았다. 예를들면 같은 상황이다.
//UserController.login()
public ResponseEntity<?> login(@RequestBody LoginDto loginDto) {
User user = userService.login(loginDto); //이 함수에 대해 설정
if(user == null) {
return new ResponseEntity<>("일치하는 유저 정보가 없습니다.", HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>("로그인 성공", HttpStatus.OK);
}
//테스트 코드
@DisplayName("올바른 정보 입력 시 로그인에 성공한다.")
@Test
@WithCustomMockUser
void loginWithValidEmailAndPassword() throws Exception {
//given
LoginDto loginDto = LoginDto.builder()
.email("test@email.com")
.password("password")
.build();
User user = User.builder().build();
//null이 아닌 user를 리턴하도록 설정했지만, UserService에서는 null을 반환
//이 조건에 걸리지 않는 문제 발생
when(userService.login(loginDto)).thenReturn(user);
...
}
해결 방법
테스트 코드에서는 LoginDto 객체를 새로 생성해주고 있으므로 UserController 파라미터 객체와 값이 같아도 주소가 달라
설정해준 조건에 맞지 않는다고 판단하는게 문제였다. primitive type 및 String은 이에 해당되지 않아서 문제가 발생하지 않는다.
LoginDto 타입의 파라미터가 들어오는 경우 통과시키고 싶은거니까 any()를 걸어주면 해결된다!
when(userService.login(any(LoginDto.class))).thenReturn(user);
댓글남기기