배 지원 closed issue #9: Post(Create,Read,Update,Delete) TestCase at 배 지원 / finalproject-baejiwon

배 지원
2023-01-12T07:13:35Z

Post(Create,Read,Update,Delete) TestCase Add

1. 목표

1. controller / 2. service로 나눠서 테스트를 진행해야 함.

1. 성공, 2. 실패 테스트 케이스를 모두 통과하는 실제 코드 작성.

Exception 처리는 enum Error코드에 작성 후 호출 해서 사용

실패의 경우 enum값의 errorCode로처리하기

when(어떤 상황일 때)를 각각 설계해보고, Test case에 따라 예상되는 결과값을 작성해주기

Controller, Service 두 클래스의 테스트 코드 작성하기

2. 게시물 작성

종류 | 성공 | 실패

Controller

포스트 작성 성공

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

포스트 작성 실패 - 로그인 하지 않은 경우

- 가입할 title, body가 입력되고 service로 요청을 보내면 사전에 정의된 INVALID_PERMISSION error를 던집니다.
- /api/v1/posts 으로 post 요청을 보냅니다.
- 정의한 ErrorCode 중, INVALID_PERMISSION를 반환합니다.

Service

포스트 등록 성공

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

포스트 등록 실패 - 로그인 하지 않은 경우

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

🔈 Service TestCase 주의할점

SpringBoot Dependency가 없이 Pojo만으로 테스트 가능 해야 합니다.

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()));
}

3. 게시물 조회(세부 내역)

종류 | 성공 | 실패

Controller

- 테스트에 사용할 PostEntity 클래스를 정의합니다.
- postService에 조회하는 함수를 호출하면, 정의한 PostEntity를 리턴합니다.
- /api/v1/posts/1에 GET 요청 시, 결과를 정상적으로 호출하는 200 상태값을 반환합니다.

없음

Service

- 테스트에 사용할 미리 정의해둔 포스트, 사용자 데이터가 포함된 test 클래스 하나와, UserEntity, PostEntity클래스를 각각 정의합니다.
- postRepository에 포스트 아이디로 포스트를 조회하는 매서드를 호출하면, 정의한 PostEntity를 리턴합니다.
- postService에서 test클래스의 포스트 아이디를 통해 포스트를 가져오고 해당 데이터를 PostDto에 넣어줍니다.
- PostDto의 userName과 test 클래스의 포스트의 작성자의 이름이 동일함을 체크합니다.

없음

4. 게시물 수정

종류 | 성공 | 실패

Controller

포스트 수정 성공
- 포스트 내용 중 수정해야하는 title, body를 정의해주고, ModifyRequest Mock 객체를 정의해줍니다.
- 포스트 수정에 사용할 Post 객체도 정의합니다.
- postService로 수정요청을 보낼 시, 위에서 정의했던 Post 객체가 return 됩니다.
- /api/v1/posts/1에 PUT 요청 시 요청한 결과로 OK, 즉 200이 반환됩니다.

공통사항

- 포스트 내용 중 수정해야하는 title, body를 정의해주고, ModifyRequest Mock 객체를 정의해줍니다.

포스트 수정 실패(1) : 인증 실패
- postService로 수정요청을 보낼 시, INVALID_PERMISSION에러가 반환됩니다.
- /api/v1/posts/1에 PUT 요청 시 요청한 결과로 권한이 없는, 즉 401이 반환됩니다.

포스트 수정 실패(2) : 작성자 불일치
- postService로 수정요청을 보낼 시, INVALID_PERMISSION 에러가 반환됩니다.
- /api/v1/posts/1에 PUT 요청 시 요청한 결과가 error code INVALID_PERMISSION와 동일합니다.

포스트 수정 실패(3) : 데이터베이스 에러
- postService로 수정요청을 보낼 시, DATABASE_ERROR 에러가 반환됩니다.
- /api/v1/posts/1에 PUT 요청 시 요청한 결과가 error code DATABASE_ERROR와 동일합니다.

Service

없음

수정 실패(1) : 포스트 존재하지 않음
- 정의한 mock 객체의 postId로 포스트를 조회할 때, 조회되는 포스트가 없습니다.
- assertThrows로 에러를 던져줍니다.
- exception이 발생한 에러코드는 POST_NOT_FOUND 값과 동일함을 확인합니다.

수정 실패(2) : 작성자!= 유저
- user 2명의 mock 객체를 만들어줍니다.
- 포스트를 db에서 조회할 때는 User 1이 작성한 포스트를 리턴해줍니다.
- 사용자를 db에서 조회할 때는 User 2 엔티티를 반환해줍니다.
- assertThrows로 에러를 던져줍니다.
- exception이 발생한 에러코드는 INVALID_PERMISSION 값과 동일함을 확인합니다.

수정 실패(3) : 유저 존재하지 않음
- 정의한 mock 객체의 postId로 포스트를 조회할 때, 조회되는 포스트는 있지만, 해당 포스트를 작성한 userName으로 조회되는 사용자는 없습니다.
- assertThrows로 에러를 던져줍니다.
- exception이 발생한 에러코드는 USERNAME_NOT_FOUND 값과 동일함을 확인합니다.

5. 게시물 삭제

종류 | 성공 | 실패

Controller

포스트 삭제 성공

- 인증된 상태로 /api/v1/posts/1 로 DELETE 요청 시 성공됨을 반환합니다.

포스트 삭제 실패(1) : 인증 실패

- 인증되지 않은 상태에서 postService의 삭제 매서드 호출 시, INVALID_PERMISSION 에러를 반환합니다.
- /api/v1/posts/1 로 DELETE 요청 시 401 권한 없음을 반환합니다.

포스트 삭제 실패(2) : 작성자 불일치
- 인증된 상태에서 postService의 삭제 매서드 호출 시, INVALID_PERMISSION 에러를 반환합니다.
- /api/v1/posts/1 로 DELETE 요청 시 결과INVALID_PERMISSION에러코드와 동일함을 확인합니다.

포스트 삭제 실패(3) : 데이터베이스 에러
- 인증된 상태에서 postService의 삭제 매서드 호출 시, DATABASE_ERROR 에러를 반환합니다.
- /api/v1/posts/1 로 DELETE 요청 시 결과DATABASE_ERROR에러코드와 동일함을 확인합니다.

Service

없음

포스트 삭제 실패(1) : 유저 존재하지 않음
- 테스트에 사용하기 위해 정의한 객체를 사용합니다.
- 위의 정의한 객체의 postId로 포스트가 있는지 조회해보면, 해당하는 포스트가 있지만 userName으로 조회된 User 정보는 없습니다.
- postService에서 삭제 요청 시, assertThrows로 에러를 던져주고, exception이 발생한 에러코드는 USERNAME_NOT_FOUND 값과 동일함을 확인합니다.

포스트 삭제 실패(2) : 포스트 존재하지 않음
- 테스트에 사용하기 위해 정의한 객체를 사용합니다.
- 위의 정의한 객체의 postId로 포스트가 있는지 조회해보면, 해당하는 포스트가 존재하지 않습니다.
- postService에서 삭제 요청 시, assertThrows로 에러를 던져주고, exception이 발생한 에러코드는 POST_NOT_FOUND 값과 동일함을 확인합니다.

포스트 삭제 실패(3) : 작성자와 유저 존재하지 않음
- 테스트에 사용하기 위해 정의한 객체와 PostEntity, UserEntity Mock객체를 정의합니다.
- 위의 테스트를 위해 정의한 객체의 postId로 포스트가 있는지 조회해보면 PostEntity mock객체가 리턴되고, 미리 정의된 테스트 객체의 userName으로 사용자를 조회하면 UserEntity mock 객체가 리턴됩니다.
- PostEntity mock객체의 user를 조회하면 UserEntity mock 객체가 리턴됩니다.
- postService에서 삭제 요청 시, assertThrows로 에러를 던져주고, exception이 발생한 에러코드는 INVALID_PERMISSION 값과 동일함을 확인합니다.

6. 게시물 조회(전체 내역)

종류 | 성공 | 실패

Controller

포스트 목록 조회 성공

- /api/v1/posts요청 시 page, size, sort 파라미터 값도 같이 넘겨준 뒤, 202 성공의 결과를 반환합니다.

- ArgumentCaptor, verify를 활용하여 파라미터로 넘어온 값들을 검증할 수 있도록 선언합니다.
- assertEquals를 활용하여 요청 시 보냈던 페이지 갯수와 사이즈를 검증하고, sort 기준도 검증합니다.

없음

Service | 없음 | 없음