최대 1 분 소요

문제 상황

로그인 테스트 코드에서 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);

References

카테고리:

업데이트:

댓글남기기