2023-04-11 화
오늘은 PostRepository와 PostService의 테스트를 진행하였다.
아직 게시글 수정 테스트는 하지 않았고, CRUD중 Create, Read 그리고 Delete에 대한 테스트만 작성하였다.
게시글 저장 테스트
@Test
@Transactional
void savePost() {
//when
PostEntity post = PostEntity.builder()
.title("first title")
.description("first description")
.postDong("상현동")
.postSido("용인시")
.postGugun("수지구")
.postLanguage("java")
.build();
//given
PostEntity result = postRepository.save(post);
//then
assertThat(post.getId()).isEqualTo(result.getId());
assertThat(post.getTitle()).isEqualTo(result.getTitle());
assertThat(post.getDescription()).isEqualTo(result.getDescription());
assertThat(post.getPostSido()).isEqualTo(result.getPostSido());
assertThat(post.getPostGugun()).isEqualTo(result.getPostGugun());
assertThat(post.getPostDong()).isEqualTo(result.getPostDong());
assertThat(post.getPostLanguage()).isEqualTo(result.getPostLanguage());
}
게시글 저장의 레파지토리 테스트이다.
나중에 DTO 클래스도 만들어 글쓰기및 수정할때 사용할 것이지만 지금 테스트는 레파지토리에 대한 테스트이기 때문에 사용하지 않았다.
가장 먼저 Entity하나를 만들어 레파지토리에 저장이 잘 되는지 테스트 하였다.
레파지토리의 테스트는 대부분 이런 식이다. 테스트 데이터를 만들어 결과를 확인하는 방법이다.
게시글 리스트 테스트
@Test
@Transactional
void postList(){
//when
PostEntity post1= PostEntity.builder()
.title("first title")
.description("first description")
.postSido("용인시")
.postGugun("수지구")
.postDong("상현동")
.postLanguage("java")
.build();
PostEntity post2 = PostEntity.builder()
.title("second title")
.description("second description")
.postSido("서울특별시")
.postGugun("강남구")
.postDong("서초동")
.postLanguage("java")
.build();
//given
postRepository.save(post1);
postRepository.save(post2);
List<PostEntity> list = postRepository.findAll();
//then
assertThat(list.size()).isEqualTo(2);
}
게시글 상세 테스트
@Test
@Transactional
void findPost() {
//when
PostEntity post = PostEntity.builder()
.title("first title")
.description("first description")
.postSido("용인시")
.postGugun("수지구")
.postDong("상현동")
.postLanguage("java")
.build();
//given
postRepository.save(post);
Optional<PostEntity> result = postRepository.findById(1L);
//then
assertThat(post.getTitle()).isEqualTo(result.get().getTitle());
assertThat(post.getDescription()).isEqualTo(result.get().getDescription());
assertThat(post.getPostSido()).isEqualTo(result.get().getPostSido());
assertThat(post.getPostGugun()).isEqualTo(result.get().getPostGugun());
assertThat(post.getPostDong()).isEqualTo(result.get().getPostDong());
assertThat(post.getPostLanguage()).isEqualTo(result.get().getPostLanguage());
}
게시글 삭제 테스트
@Test
@Transactional
void deletePost() {
//when
PostEntity post = PostEntity.builder()
.title("first title")
.description("first description")
.postSido("용인시")
.postGugun("수지구")
.postDong("상현동")
.postLanguage("java")
.build();
//given
postRepository.save(post);
postRepository.deleteById(1L);
//then
assertThat(postRepository.findById(1L)).isEmpty();
}
레파지토리 테스트를 통해 서비스 테스트도 진행하였다.
게시글 저장 테스트
@Test
@Transactional
void savePost() {
//when
PostDto post = PostDto.builder()
.title("first title")
.description("first description")
.postDong("상현동")
.postSido("용인시")
.postGugun("수지구")
.build();
//given
PostEntity result = postService.save(post);
Optional<PostEntity> expect = postRepository.findById(1L);
//then
assertThat(expect.get().getId()).isEqualTo(result.getId());
assertThat(post.getTitle()).isEqualTo(result.getTitle());
assertThat(post.getDescription()).isEqualTo(result.getDescription());
assertThat(post.getPostSido()).isEqualTo(result.getPostSido());
assertThat(post.getPostGugun()).isEqualTo(result.getPostGugun());
assertThat(post.getPostDong()).isEqualTo(result.getPostDong());
}
Service부분을 테스트하기 위해서는 PostService의 코드가 필요하다.
이 코드는 서비스 계층을 통한 게시글을 저장하기 위한 테스트이다.
public PostEntity save(PostDto postDto) {
PostEntity postEntity = postDto.toEntity();
PostEntity saved = postRepository.save(postEntity);
return saved;
}
위 코드는 게시글 저장을 위한 service클래스의 메소드이다.
서비스 부분에서는 DTO를 사용해 DTO를 Entity로 변경후 저장하는 서비스를 만들었다.
게시글 리스트 테스트
@Test
@Transactional
void postList(){
//when
PostDto post1= PostDto.builder()
.title("first title")
.description("first description")
.postSido("용인시")
.postGugun("수지구")
.postDong("상현동")
.build();
PostDto post2 = PostDto.builder()
.title("second title")
.description("second description")
.postSido("서울특별시")
.postGugun("강남구")
.postDong("서초동")
.build();
//given
postService.save(post1);
postService.save(post2);
List<PostEntity> list = postService.readAll();
//then
assertThat(list.size()).isEqualTo(2);
}
public List<PostEntity> readAll(){
List<PostEntity> list = postRepository.findAll();
return list;
}
게시글 상세 테스트
@Test
@Transactional
void findPost() {
//when
PostDto post = PostDto.builder()
.title("first title")
.description("first description")
.postSido("용인시")
.postGugun("수지구")
.postDong("상현동")
.build();
//given
postService.save(post);
Optional<PostEntity> result = postService.read(1L);
//then
assertThat(post.getTitle()).isEqualTo(result.get().getTitle());
assertThat(post.getDescription()).isEqualTo(result.get().getDescription());
assertThat(post.getPostSido()).isEqualTo(result.get().getPostSido());
assertThat(post.getPostGugun()).isEqualTo(result.get().getPostGugun());
assertThat(post.getPostDong()).isEqualTo(result.get().getPostDong());
}
public Optional<PostEntity> read(Long postId) {
Optional<PostEntity> post = postRepository.findById(postId);
return post;
}
게시글 삭제 테스트
@Test
@Transactional
void deletePost() {
//when
PostDto post = PostDto.builder()
.title("first title")
.description("first description")
.postSido("용인시")
.postGugun("수지구")
.postDong("상현동")
.build();
//given
postService.save(post);
postRepository.deleteById(1L);
//then
assertThat(postRepository.findById(1L)).isEmpty();
}
public void delete(Long postId) {
postRepository.deleteById(postId);
}
아직 TDD 환경에 적응하지 못해 완벽하지는 않은 것 같다.
앞으로 프로젝트를 진행하면서 좀 더 발전한 테스트를 만들고 싶다.