다음 테스트코드에서 "올바른 대댓글 형식의 대댓글 저장" 테스트코드가 실패하는 이유를 직접 실행해보지 않고도, 알 수 있는 사람이 되고 싶다..!
왜 안되는지 읽어봤으면 좋겠다 !!
힌트 : PostgreSQL serial type
@ActiveProfiles("test") //test profile
@SpringBootTest
@ExtendWith(SpringExtension.class)
@ContextConfiguration
class CommentRepositoryImplTest {
@Autowired
DataSource dataSource;
@Autowired
CommentRepository commentRepository;
private MemberProfileEntity testUserProfileEntity = new MemberProfileEntity("회원 프로필 이미지 저장 경로","회원 닉네임","회원 자기소개","회원 개인 태그");
@BeforeAll
static void setup(@Autowired DataSource dataSource) {
try (Connection conn = dataSource.getConnection()) {
ScriptUtils.executeSqlScript(conn, new ClassPathResource("CommentRepository.sql"));
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@BeforeEach
void beforeEach(){
Comment comment = new Comment(1L,
testUserProfileEntity,
Date.valueOf(now()),
null,
new CommentSaveDto(PostType.MEMO,1L,"댓글 내용 저장"));
commentRepository.createComment(comment);
}
@Test
@DisplayName("올바른 댓글 형식에서의 댓글 저장 성공")
void createValidComment(){
Comment comment = new Comment(1L,
testUserProfileEntity,
Date.valueOf(now()),
null,
new CommentSaveDto(PostType.MEMO,1L,"댓글 내용 저장"));
assertThatCode(()->commentRepository.createComment(comment)).doesNotThrowAnyException();
}
@Test
@DisplayName("올바른 댓글 형식의 댓글 수정 성공")
void updateComment(){
CommentUpdateDto commentUpdateDto = new CommentUpdateDto("수정된 댓글 내용");
commentRepository.updateComment(commentUpdateDto,1L); //Before Each로 넣어놓은 댓글 수정
assertThat(commentRepository.getCommentsAtPost(PostType.MEMO, 1L, 1L).get(0).getCommentText())
.isEqualTo("수정된 댓글 내용");
}
@Test
@DisplayName("댓글 삭제 성공")
void deleteComment(){
assertThatCode(
()->commentRepository.deleteComment(1L))
.doesNotThrowAnyException();
}
@Test
@DisplayName("올바른 대댓글 형식의 대댓글 저장")
void createReComment(){
assertThatCode(
()->commentRepository.createReComment(new ReComment(1L,
testUserProfileEntity,
Date.valueOf(now()),
null,
1L,
"대댓글 내용")))
.doesNotThrowAnyException();
}
@Test
@DisplayName("댓글이 존재하지 않지만, 대댓글 저장할 경우")
void createReCommentWhenParentCommentDoestNotExist(){
assertThatThrownBy(
()->commentRepository.createReComment(new ReComment(1L,
testUserProfileEntity,
Date.valueOf(now()),
null,
2L,
"대댓글 내용")))
.isInstanceOf(NotFoundException.class);
}
}
문제는 @BeforeEach
때문이다.
@BeforeEach
로 매번 테스트 DB (나의 경우에는 인메모리 H2) 에 Comment를 추가한다. DB에는 serial 형태로 새로운 Comment 가 table에 들어올때마다, 알아서 PK값이 증가되면서 table에 추가된다.
전체 테스트 코드를 실행하면서 테스트 메서드를 매번 실행할 때마다, DB에 Comment 정보가 하나씩 생성됨을 잊지 말아야한다.
내가 앞서서, Comment 데이터중 1번 PK값을 가지는 Comment를 삭제하는 테스트 코드를 추가하였기 때문에, 전체 테스트중 "올바른 대댓글 형식의 대댓글 저장" 메서드에서 대댓글 달 댓글 정보가 없으니 테스트에 실패하는 것이다.