https://github.com/wootaepark/spring-advanced
지금까지 Spring 프레임워크를 공부해오면서 어떻게 보면 가장 정해진 기준이나 정보가 없다고 느껴지는 것이 테스트 코드 부분이라고 생각한다.
실제로 동작하는 코드를 짜는 것은 구글링, 강의 등을 통해 학습하여 나만의 방식으로 코딩을 할 수는 있지만 테스트 코드 관련 학습을 진행하면서 실제로 나의 코드에 적용해보기 쉽지 않다고 생각을 하게되어 주어진 테스트코드 과제를 수행하면서 어려움을 겪은 부분을 공유하고자 한다.

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

=> 로그를 보니까 실제 예외와 예상 예외가 다르다는 것을 파악을 했다.
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 값을 통해 일정을 찾는데 이때 찾을 수 없다고 가정한다.
ServerException exception = assertThrows(ServerException.class, () -> {
commentService.saveComment(authUser, todoId, request);
});
위 코드에 의하면
commentService.saveComment호출 시todoId에 해당 하는 값이 없으면 ServerException 이 발생하는지 확인 해야 한다.
assertEquals("Todo not found", exception.getMessage());
발생한 예외의 메세지가 주어진 메세지와 일치하는지 확인함으로서 올바른 예외처리가 되었는지 확인한다.
@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.findById가empty하도록 설정하였고
그래서 위에서 발생하는 예외와 예외 메시지는InvalidRequestException그리고 "Todo not found" 가되는 것이었다.

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


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


=> 위와 같이 주어진 테스트 코드를 통해 단위 테스트를 해보면서 테스트 코드와 어느정도 친해질 수 있었던 것 같다. 하지만 이렇게 주어진 코드 말고 내가 실제로 테스트 코드를 짜보는 것은 아직도 쉽지 않은 것 같다.
다음 프로젝트 전 충분히 테스트 코드에 대한 공부를 하고, 꼭 해당 프로젝트에 테스트코드를 적용해보고 싶다고 생각한다.