[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);
댓글남기기