@WebMvcTest로 컨트롤러 테스트시 ViewResolver 에러 발생 문제


문제 배경

  • BoardController 컨트롤러에 대한 테스트 코드를 작성하던 중, 에러가 발생했다.
  • @WebMvcTest 를 통해, 유닛 테스트를 작성하던 상태였다.
  • BoardController 클래스의 showArticleAddForm 메서드에 대한 테스트 작성하던 상태다.

  • 테스트 코드 작성 완료 후 실행을 했는데, View Resolver 관련 에러가 발생했다.
  • BoardController 클래스의 showArticleAddForm 메서드
    @GetMapping("/new-article")
    public String showArticleAddForm(@ModelAttribute("article") NewArticleForm form) {
        return "new-article";
    }
    
  • BoardControllerTest 테스트 클래스의 showArticleAddFormTest 메서드
    @DisplayName("새 게시글 작성 창 보이기")
    @Test
    void showArticleAddFormTest() throws Exception {
      //given
      NewArticleForm form = new NewArticleForm();
      form.setTitle("New Article Title");
      form.setContent("New Article Content");
    
      //when
      ResultActions actions = mockMvc.perform(
        get("/board/new-article")
      );
    
      //then
      actions.andExpect(status().isOk())
          .andExpect(view().name("new-article"));
    }
    
  • 발생 오류 Untitled



문제 해결 탐색과정

  • 해당 에러 메시지에 대해 구글링을 하여 조사하였다.



문제 해결

문제 원인

  • BoardController 컨트롤러 클래스의 showArticleAddForm 메서드의 문제였다.
  • “해당 메서드의 @GetMapping의 URI”와 “해당 메서드의 반환값인 뷰 이름”이 동일하여 발생하는 문제이다.
  • BoardController 클래스의 showArticleAddForm 메서드
    @GetMapping("/new-article") //이것과
    public String showArticleAddForm(@ModelAttribute("article") NewArticleForm form) {
      return "new-article"; //이것이 동일한 문자열이다.
    }
    



해결방법

  • 뷰의 이름과 매핑되는 URI 명을 다르게 변경하면 된다.
  • 예시
    • BoardController 클래스의 showArticleAddForm 메서드
      @GetMapping("/new-article")
      public String showArticleAddForm(@ModelAttribute("article") NewArticleForm form) {
      // return "new-article"; //기존 뷰이름
      return "add-article"; //새 뷰이름
      }