들어가기에 앞서
실제 프로젝트 진행했던 코드 내용 및 세부 내용은 일부만 업로드하였습니다.
@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가 호출되어야 한다!
}
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가 호출되어야 한다!
}
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);
}
}
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가 호출되어야 한다!
}
public void deleteArticle(long articleId) {
}
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;
}
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;
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를 호출해야 한다다
}
@Transactional(readOnly = true)
public List<ArticleCommentDto> searchArticleComment(long articleId) {
return List.of();
}
}