TIL_220803_강의용 게시판 프로젝트 9

창고·2022년 8월 4일
0

들어가기에 앞서
실제 프로젝트 진행했던 코드 내용 및 세부 내용은 일부만 업로드하였습니다.

11. 게시판 서비스 뷰 기능 정의

(2) 게시글 페이지 기능 테스트 정의

  • 게시글 생성 테스트
    @DisplayName("CREATE - 게시글 정보 입력 시 게시글을 생성")
    @Test
    void givenArticleInfo_whenSavingArticle_thenSavesArticle() {
        // Given
        // static import [ given = BDDMockito.given, any = ArgumentMatchers.any ]
        given(articleRepository.save(any(Article.class))).willReturn(null); // articleRepository에 Article.class의 아무거나 저장하고 null을 리턴

        // When
        sut.saveArticle(ArticleDto.of(LocalDateTime.now(), "mrcocoball", "테스트용 제목", "테스트입니다", "#test"));

        // Then
        then(articleRepository).should().save(any(Article.class)); // articleRepository의 save가 호출되어야 한다!
    }
  • 테스트 메소드의 saveArticle을 위해 본래 Service에 saveArticle 메소드 작성
    public void saveArticle(ArticleDto dto) {
    }
  • 게시글 수정 테스트
    @DisplayName("UPDATE - 게시글의 ID와 수정 정보 입력 시 게시글을 수정")
    @Test
    void givenArticleInfo_whenSavingArticle_thenSavesArticle() {
        // Given
        // static import [ given = BDDMockito.given, any = ArgumentMatchers.any ]
        given(articleRepository.save(any(Article.class))).willReturn(null); // articleRepository에 Article.class의 아무거나 저장하고 null을 리턴

        // When
        sut.updateArticle(1L, ArticleUpdateDto.of( "테스트용 제목", "테스트입니다", "#test"));

        // Then
        then(articleRepository).should().save(any(Article.class)); // articleRepository의 save가 호출되어야 한다!
    }
  • ArticleUpdateDto
    • implements Serializable 지웠음 (ArticleDto도 동일)
public record ArticleUpdateDto(
        String title,
        String content,
        String hashtag
) {
    public static ArticleUpdateDto of(String title, String content, String hashtag) {
        return new ArticleUpdateDto(title, content, hashtag);
    }
}
  • 테스트 메소드의 updateArticle을 위해 본래 Service에 updateArticle 메소드 작성
    public void updateArticle(long articleId, ArticleUpdateDto dto) {
    }
  • 게시글 삭제 테스트
    @DisplayName("DELETE - 게시글의 ID 입력 시 게시글을 삭제")
    @Test
    void givenArticleId_whenDeletingArticle_thenDeleteArticle() {
        // Given
        // static import [ given = BDDMockito.given, any = ArgumentMatchers.any ]
        willDoNothing().given(articleRepository).delete(any(Article.class)); // articleRepository에 Article.class의 아무거나 삭제

        // When
        sut.deleteArticle(1L);

        // Then
        then(articleRepository).should().delete(any(Article.class)); // articleRepository의 delete가 호출되어야 한다!
    }
  • 테스트 메소드의 deleteArticle을 위해 본래 Service에 deleteArticle 메소드 작성
    public void deleteArticle(long articleId) {
    }

(3) 게시글 - 댓글 기능 테스트 정의

  • ArticleCommentService 생성
import com.fastcampus.projectboard.repository.ArticleCommentRepository;
import com.fastcampus.projectboard.repository.ArticleRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Transactional
@Service
public class ArticleCommentService {

    private final ArticleCommentRepository articleCommentRepository;
    private final ArticleRepository articleRepository;
}
  • ArticleCommentServiceTest 생성
import com.fastcampus.projectboard.repository.ArticleCommentRepository;
import com.fastcampus.projectboard.repository.ArticleRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@DisplayName("비즈니스 로직 - 댓글")
@ExtendWith(MockitoExtension.class)
class ArticleCommentServiceTest {

    @InjectMocks
    private ArticleCommentService sut; // Mock을 주입해주는 대상에만 @InjectMocks

    @Mock
    private ArticleCommentRepository articleCommentRepository; // InjectMocks 외의 모든 대상

    @Mock
    private ArticleRepository articleRepository;
  • ArticleCommentDto 생성 + canonical constructor
import java.time.LocalDateTime;

public record ArticleCommentDto(
        LocalDateTime createdAt,
        String createdBy,
        LocalDateTime modifiedAt,
        String modifiedBy,
        String content
) {
    public static ArticleCommentDto of(LocalDateTime createdAt, String createdBy, LocalDateTime modifiedAt, String modifiedBy, String content) {
        return new ArticleCommentDto(createdAt, createdBy, modifiedAt, modifiedBy, content);
    }
}
  • 댓글 리스트 검색 테스트
    @DisplayName("READ - 게시글 ID로 조회 시 해당 게시글의 댓글 리스트 반환")
    @Test
    void givenArticleId_whenSearchingComments_thenReturnsComments() {
        // Given
        Long articleId = 1L;
        // static import [ given = BDDMockito.given]
        given(articleRepository.findById(articleId)).willReturn(Optional.of(
                Article.of("title", "content", "#java"))
                // articleRepository의 article 엔티티를 articleId로 찾을 때 title, content, #java를 리턴하게끔
        );

        // When
        List<ArticleCommentDto> articleComments = sut.searchArticleComment(1L); // 댓글 리스트

        // Then
        assertThat(articleComments).isNotNull(); // 댓글 리스트는 null이 아님
        then(articleRepository).should().findById(articleId); // articleRepository에서 findById를 호출해야 한다다
    }
  • 테스트 메소드의 searchArticleComment를 위해 본래 Service에 searchArticleComment 메소드 작성
    @Transactional(readOnly = true)
    public List<ArticleCommentDto> searchArticleComment(long articleId) {
        return List.of();
    }
}
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글