///////
Search
☀️

3일차 힌트

개요

3일차에 구현해야 할 내용은 포스트 작성에 대한 내용입니다.

목표

PostController, PostService를 작성하여 포스트를 작성하는 기능을 구현 합니다.
해당 코드가 정상적으로 실행되는지 확인하기 위해서 하나의 api에 대해 성공하는 경우와 실패하는 경우를 설계해봅니다.
Controller, Service에 목적에 집중해서 각각 계층에 해당하는 로직에 대해서만 테스트 할 수 있도록 합니다.
Test에 필요한 Mock 객체를 미리 정의해줍니다.
@WithMockUser(인증된 상태) , @WithAnonymousUser(인증되지 않은 상태)를 활용하여 테스트합니다.

포스트 작성 테스트 코드

Controller

성공하는 경우(1가지)

포스트 작성 성공
포스트를 작성 시 필요한 title, body가 입력되고 service로 요청을 보내고, 작성할 포스트가 하나 만들어집니다.
/api/v1/posts 으로 post 요청을 보냅니다.
요청한 결과로 OK, 즉 200이 반환됩니다.

실패하는 경우(1가지)

포스트 작성 실패 - 로그인 하지 않은 경우
가입할 title, body가 입력되고 service로 요청을 보내면 사전에 정의된 INVALID_PERMISSION error를 던집니다.
/api/v1/posts 으로 post 요청을 보냅니다.
정의한 ErrorCode 중, INVALID_PERMISSION를 반환합니다.

Service

SpringBoot Dependency가 없이 Pojo만으로 테스트 가능 해야 합니다.
ex) 아래와 같이 class에 Annotation없이도 테스트 가능해야 합니다.
public class PostServiceTest { PostService postService; PostRepository postRepository = Mockito.mock(PostRepository.class); UserRepository userRepository = Mockito.mock(UserRepository.class); LikeEntityRepository likeEntityRepository = Mockito.mock(LikeEntityRepository.class); CommentEntityRepository commentEntityRepository = Mockito.mock(CommentEntityRepository.class); @BeforeEach void setUp() { postService = new PostService(postRepository, userRepository, likeEntityRepository, commentEntityRepository); } @Test @DisplayName("등록 성공") void post_success() { TestInfoFixture.TestInfo fixture = TestInfoFixture.get(); PostEntity mockPostEntity = mock(PostEntity.class); UserEntity mockUserEntity = mock(UserEntity.class); when(userRepository.findByUserName(fixture.getUserName())) .thenReturn(Optional.of(mockUserEntity)); when(postRepository.save(any())) .thenReturn(mockPostEntity); Assertions.assertDoesNotThrow(() -> postService.write(fixture.getTitle(), fixture.getBody(), fixture.getUserName())); }
JavaScript
복사

성공하는 경우(1가지)

포스트 등록 성공
포스트를 작성하는 User, 작성한 Post에 대한 Mock 객체를 임의로 만들어줍니다.
Mock으로 만들어준 User의 userName을 통해 db에서 조회해보면 User Mock객체가 정상적으로 리턴됩니다.
작성한 포스트를 정상적으로 db에 등록해주게되면, Post Mock 객체가 정상적으로 리턴됩니다.
Assertions.assertDoesNotThrow를 통해 service에서 포스트 등록 로직이 에러없이 정상적으로 처리됩니다.

실패하는 경우(1가지)

포스트 등록 실패 - 로그인 하지 않은 경우
정의한 Mock 객체를 사용하기 위해 선언해줍니다.
해당 Mock 객체의 User의 userName을 통해 db에서 조회해보면 해당 정보로 조회되는 user가 존재하지 않고 빈값이 리턴됩니다.
작성한 포스트를 정상적으로 db에 등록해주게되면, Post Mock 객체가 정상적으로 리턴됩니다.
포스트 등록 시, Assertions.assertThrow에서 에러가 발생하게 되고, 해당 에러는 사전에 정의한 ErrorCode 중, USERNAME_NOT_FOUND와 동일한 에러 코드임을 확인합니다.