개인과제-심화(TestCode)

송민지·2024년 9월 11일

사진의 테스트코드가 통과할 수 있도록 서비스 코드를 수정하는것이 문제였습니다.

테스트코드가 실행되는 서비스코드는 다음과 같습니다.

 if (!ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) {
            throw new InvalidRequestException("담당자를 등록하려고 하는 유저가 일정을 만든 유저가 유효하지 않습니다.");
        }

서비스 코드는 InvalidRequestException을 기대했지만, 실행된건 NullPointException이였습니다.

일단 테스트코드는 통과 하였으나 왜 통과 하였는지 알수가 없어서 튜터님께 질문해보니 오히려 역으로 질문을 하셨습니다.

  1. 현재 testcode는 todo객체의 user를 어떻게 정의하고 있나?
  2. null을 반환하는 곳은 어디인가?
  3. 현재 service의 코드는 로그인한 user의 user.getId()와 todo객체를 작성한 user의 id를 비교 하고 있다. null이 반환될 만한 곳은 어디인가?
    (질문이 점점 쉬워지고 있다..)
  4. 수정해야 할 곳은 로그인한 user의 user.getId()와 todo객체를 작성한 user의 id를 비교 하는 부분이다. 이 기능은 유지하며 수정해보자.
  5. null을 잡게되면 throw new InvalidRequestException을 반환해야 한다.
    물론 user.getId() 와 todo.getUser().getId()가 다를경우도 throw new InvalidRequestException을 반환해야 한다.
    (다 해줬다진짜루)

최종 수정된 코드는 다음과 같습니다.

 if (todo.getUser() == null || !ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) {
            throw new InvalidRequestException("담당자를 등록하려고 하는 유저가 일정을 만든 유저가 유효하지 않습니다.");
        }

todo.getUser가 null일 경우 뒤의 코드는 실행되지 않으며 바로 InvalidRequestException을 반환하게 됩니다.
user가 null이 아니지만, user.getId()가 todo.getUser().getId()와 다르다면,
InvalidRequestException을 반환하게 됩니다.

생각해보면 간단한건데 왜 생각하지 못했을까요..

뿌엥

profile
항상 밝게

0개의 댓글