이제 게시판 뷰의 엔드 포인트중에서 인증을 제외한
위의 항목들의 뷰 엔드 포인트를 테스트 하는 작업을 진행한다.
뷰를 만들기 위한 thymeleaf를 디펜던시에 추가하고 컨트롤러를 직접 만든다. 루트경로에 controller
를 생성하고 ArticleController.java
를 만든다. 해당클래스의 이름과 동일한 테스트를 생성한다.
@DisplayName("View 컨트롤러 - 게시글")
@WebMvcTest(ArticleController.class)
class ArticleControllerTest {
private final MockMvc mvc;
public ArticleControllerTest(@Autowired MockMvc mvc) {
this.mvc = mvc;
}
@Disabled("구현 중")
@DisplayName("[view][GET] 게시글 리스트 (게시판) 페이지 - 정상 호출")
@Test
public void givenNothing_whenRequestingArticlesView_thenReturnsArticlesView() throws Exception {
// Given
// When & Then
mvc.perform(get("/articles"))
.andExpect(status().isOk()) // 정상 호출
.andExpect(result -> content().contentType(MediaType.TEXT_HTML)) // 데이터 확인
.andExpect(view().name("articles/index")) // 뷰의 존재여부 검사
.andExpect(model().attributeExists("articles")); // 뷰에 모델 어트리뷰트로 넣어준 데이터존재 여부 검사
}
@Disabled("구현 중")
@DisplayName("[view][GET] 게시글 상세 페이지 - 정상 호출")
@Test
public void givenNothing_whenRequestingArticleView_thenReturnsArticleView() throws Exception {
// Given
// When & Then
mvc.perform(get("/articles/1"))
.andExpect(status().isOk()) // 정상 호출
.andExpect(result -> content().contentType(MediaType.TEXT_HTML)) // 데이터 확인
.andExpect(view().name("articles/detail")) // 뷰의 존재여부 검사
.andExpect(model().attributeExists("article")) // 뷰에 모델 어트리뷰트로 넣어준 데이터존재 여부 검사
.andExpect(model().attributeExists("articleComments"));
}
@Disabled("구현 중")
@DisplayName("[view][GET] 게시글 검색 전용 페이지 - 정상 호출")
@Test
public void givenNothing_whenRequestingArticleSearchView_thenReturnsArticleSearchView() throws Exception {
// Given
// When & Then
mvc.perform(get("/articles/search"))
.andExpect(status().isOk()) // 정상 호출
.andExpect(result -> content().contentType(MediaType.TEXT_HTML)) // 데이터 확인
.andExpect(view().name("articles/search")); // 뷰의 존재여부 검사
}
@Disabled("구현 중")
@DisplayName("[view][GET] 게시글 해시태그 검색 페이지 - 정상 호출")
@Test
public void givenNothing_whenRequestingArticleHashtagSearchView_thenReturnsArticleHashtagSearchView() throws Exception {
// Given
// When & Then
mvc.perform(get("/articles/search-hashtag"))
.andExpect(status().isOk()) // 정상 호출
.andExpect(result -> content().contentType(MediaType.TEXT_HTML)) // 데이터 확인
.andExpect(view().name("articles/search-hashtag")); // 뷰의 존재여부 검사
}
}
4개의 테스트를 작성했다. 게시글 리스트 페이지, 게시글 상세, 게시글 검색, 게시글 해시태그 검색 페이지 호출 테스트로 구성되어있다. 테스트를 돌리면 당연히 현재 데이터가 존재하지 않기 때문에 오류가 나타난다. 추가적으로 WebMvcTest는 테스트 실행시 다른 webMvcTest를 전부 실행하므로 따로 클래스를 선택하면 해당 테스트만 작동한다.
@WebMvcTest(ArticleController.class)
이제 테스트 작성을 완료했으므로 커밋한다...
일단 데이터가 존재하지 않으니 실패한 테스트들을 커밋을 올려서 메인에 merge하는 것은 협업으로 일할때 그렇게 좋은 방법은 아니다.
왜?
지금 프로젝트 gradle에서 build를 돌려보면 답을 알수 있다. 아마 빌드를 돌리면 test까지 돌아가기 때문에 build가 실패하는데, 만약 이 프로젝트를 그대로 커밋해서 푸쉬해버리면 다른 개발자들이 빌드를 못하게 될수도 있는 것이다.
따라서, 이럼에도 불구하고 이런 테스트 내용을 커밋하려고 한다면, 빌드에 영향을 미치지 않게 조치를 취해줘야 한다. build의 설정을 변경해서 test를 제외하고 build를 할 수도 있고, 실패하는 테스트 들을 ignore 처리하는 방법이 있다. 나는 후자의 방법을 택했고, 실패하는 테스트마다 각각 @Disabled
어노테이션을 추가할 것이다.