개요
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와 동일한 에러 코드임을 확인합니다.