
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 환경에 적응하지 못해 완벽하지는 않은 것 같다.
앞으로 프로젝트를 진행하면서 좀 더 발전한 테스트를 만들고 싶다.