Presentation Layer Test - 뷰를 던져주는 컨트롤러는 어떻게 테스트할까?

yeom yaloo·2024년 4월 7일
0

백엔드 관련 지식

목록 보기
7/7

🖼 View를 던지는 @Controller

뷰를 전달하는 컨트롤러 예시 코드

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {

    @GetMapping("/")
    public String indexForm(){

        return "main/index";
    }
    @GetMapping("/event/main")
    public String mainEventForm(){
        return "event/main";
    }
}

뷰 컨트롤러 단위 테스트 코드

package imyeom_lck.common.controller;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;

@WebMvcTest(IndexController.class)
class IndexControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @BeforeEach
    void setUp() {

    }

    @Test
    void indexForm() throws Exception {
        this.mockMvc.perform(get("/"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(view().name("main/index"));
    }

    @Test
    void mainEventForm() throws Exception {
        this.mockMvc.perform(get("/event/main"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(view().name("event/main"));

    }
}

테스트 결과 값

1. @WebMvcTest(IndexController.class)

  • 컨트롤러 단위 테스트에 사용하는 애너테이션
  • 이미 슬라이스 테스트가 가능하게 구현되어 있어서 이 애너테이션을 사용하면 가볍고 빠르게 진행이 가능해요.

2. .andExpect(view().name("event/main")

  • 해당 메서드를 사용해서 view name이 해당 이름 인지를 확인합니다.
  • 경로를 확인한다고 생각하면 됩니다. (main/index, event/main)

2. @SpringBootTest + @AutoConfigureMockMvc → 통합 테스트에서 사용

  • 스프링 내부에 빈을 모두 등록해서 테스트에 필요한 의존성을 추가해요.
  • 실제 운영 환경에서 사용될 클래스들을 통합해서 테스트가 가능해요.
  • 단위 테스트를 진행할 목적이 아닌 프로젝트 내부의 Flow가 제대로 동작하는지를 검증하기 위해서 사용해요

장점

  • 운영 환경과 가장 유사한 테스트가 가능해요
  • 그 이유는 모든 빈과 설정 등을 로드하기 때문이에요.

단점

  • 테스트의 단위 자체가 커지기 때문에 디버깅이 까다롭다는 단점이 있어요.
  • 또한 모든 빈과 설정을 로드하기 때문에 시간이 오래 걸려요.
profile
즐겁고 괴로운 개발😎

0개의 댓글