본문 바로가기

TIL(Today I Learned)

TIL-231013(테스트 실행 시 예외 메시지를 가져오지 않는 문제)

📝오늘 공부한 것

  • 실전프로젝트 - '행동대장' 테스트 코드 작성하기
  • 커리어톤 참여하기
  • 프로그래머스 문제 풀기

 

📌 Jacoco로 코드 커버리지 측정하기

⛔문제점

닉네임 변경에 대한 테스트코드를 작성했는데, 그중 이미 등록되어 있는 이메일로 이메일 변경을 했을 때의 실패코드를 작성하였다.

내가 기대하는 것은 "등록된 이메일이 있습니다"라는 메시지였는데, 테스트 코드를 실행했더니 null값이 나왔다.

 

[updateNickname메서드]

    public CommonResponse updateNickname(UpdateNicknameRequestDto requestDto, User user) {
        String newNickname = requestDto.nickname();
        if(userRepository.findByNickname(newNickname).isPresent()){
            throw new CommonException(DUPLICATE_NICKNAME);
        }
        user.updateNickname(newNickname);
        userRepository.save(user);
        return new CommonResponse(UPDATE_NICKNAME);
    }

 

[실패 테스트코드]

        @Test
        @DisplayName("이메일 업데이트 - 실패")
        void test2(){
            //given
            UpdateEmailRequestDto requestDto = new UpdateEmailRequestDto("coco@naver.com");
            MyPageService myPageService = new MyPageService(userRepository, passwordEncoder);
            User user = new User("코코","abcd1234","coco@naver.com",UserRoleEnum.USER);

            //when
            Exception exception = assertThrows(CommonException.class, ()->{
                myPageService.updateEmail(requestDto, user);
            });

            //then
            assertEquals("등록된 이메일이 있습니다.", exception.getMessage());
        }

 

[결과]

 

💯해결

기존의 exception을 사용한 것이 아닌 custom exception을 사용하였다.

Jacoco가 예외메시지를 정확하게 가져오지 못해서, 예외 메시지가 null로 나타났다.

그래서, Jacoco가 예외 메시지를 정확하게 가져오도록 CommonException클래스를 수정하였다.

 

방법①

CommonException클래스 내에서 부모클래스인 RuntimeException의 getMessage() 메서드를 오버라이드하여 errorCode의 메시지를 반환하게 만들어 Jacoco가 예외 메시지를 가져올 수 있도록 하였다.

 

 

방법②

CommonException클래스를 수정하여, 예외 메시지를 직접 반환하여 Jacoco에서 예외메시지를 가져올 수 있도록 하였다.