Test Code Trouble Shooting

‍박태우·2024년 10월 31일

nbc_spring

목록 보기
27/28

0. 참고 코드

https://github.com/wootaepark/spring-advanced

1. 배경

지금까지 Spring 프레임워크를 공부해오면서 어떻게 보면 가장 정해진 기준이나 정보가 없다고 느껴지는 것이 테스트 코드 부분이라고 생각한다.

실제로 동작하는 코드를 짜는 것은 구글링, 강의 등을 통해 학습하여 나만의 방식으로 코딩을 할 수는 있지만 테스트 코드 관련 학습을 진행하면서 실제로 나의 코드에 적용해보기 쉽지 않다고 생각을 하게되어 주어진 테스트코드 과제를 수행하면서 어려움을 겪은 부분을 공유하고자 한다.

2. 발단

=> 위와 같은 주어진 테스트 코드가 올바르게 동작하도록 수정하는 것이었다. 해당 코드를 실행해보니 아레와 같이 테스트가 실패하였다.

=> 로그를 보니까 실제 예외와 예상 예외가 다르다는 것을 파악을 했다.

3. 전개

  • given, when, then 을 통해 각각 분석해보기

  • given

long todoId = 1;
CommentSaveRequest request = new CommentSaveRequest("contents");
AuthUser authUser = new AuthUser(1L, "email", UserRole.USER);

given(todoRepository.findById(anyLong())).willReturn(Optional.empty());

Comment 를 저장하기 위한 request Dto를 설정해준다.
그리고 AuthUser Entity 객체를 하나 생성해준다. (테스트로)
Id 값을 통해 일정을 찾는데 이때 찾을 수 없다고 가정한다.

  • when
 ServerException exception = assertThrows(ServerException.class, () -> {
            commentService.saveComment(authUser, todoId, request);
});

위 코드에 의하면 commentService.saveComment 호출 시 todoId 에 해당 하는 값이 없으면 ServerException 이 발생하는지 확인 해야 한다.

  • then
assertEquals("Todo not found", exception.getMessage());

발생한 예외의 메세지가 주어진 메세지와 일치하는지 확인함으로서 올바른 예외처리가 되었는지 확인한다.

4. 위기

  • 테스트 코드가 보기에는 멀쩡해보이지만 테스트 하면 실패하는 이유는 예외의 종류가 달라서 였다.
 @Transactional
    public CommentSaveResponse saveComment(AuthUser authUser, long todoId, CommentSaveRequest commentSaveRequest) {
        User user = User.fromAuthUser(authUser);
        Todo todo = todoRepository.findById(todoId).orElseThrow(() ->
                new InvalidRequestException("Todo not found"));

        Comment newComment = new Comment(
                commentSaveRequest.getContents(),
                user,
                todo
        );

        Comment savedComment = commentRepository.save(newComment);

        return new CommentSaveResponse(
                savedComment.getId(),
                savedComment.getContents(),
                new UserResponse(user.getId(), user.getEmail())
        );
    }

위 테스트 코드 중에 saveComment 가 구현된 부분이다. 이때 이전의 given 에서 todoRepository.findByIdempty 하도록 설정하였고
그래서 위에서 발생하는 예외와 예외 메시지는 InvalidRequestException 그리고 "Todo not found" 가되는 것이었다.

5. 절정

하지만 위와같이 주어진 when 절에서는 saveComment 메서드가 ServerException 을 발생시키길 예상하고 있기 때문에
then 절에서 테스트 실패가 일어나는 것이었다.
아래 exception.getMessage() 에서는 ServerException 이 들어감

6. 결말

따라서 원인을 발생시키는 when 절을 위와 같이 InvalidRequestException 이 일어나도록 하였고 then 절에서 비교해 보았으며 결과는 아래와 같이 테스트가 통과 한것을 확인 할 수 있었다.

7. 소감

=> 위와 같이 주어진 테스트 코드를 통해 단위 테스트를 해보면서 테스트 코드와 어느정도 친해질 수 있었던 것 같다. 하지만 이렇게 주어진 코드 말고 내가 실제로 테스트 코드를 짜보는 것은 아직도 쉽지 않은 것 같다.

다음 프로젝트 전 충분히 테스트 코드에 대한 공부를 하고, 꼭 해당 프로젝트에 테스트코드를 적용해보고 싶다고 생각한다.

profile
잘 부탁드립니다.

0개의 댓글