MockMvc는 Spring MVC의 컨트롤러에 대한 통합 테스트를 지원하는 테스트 프레임워크이다.

MockMvcBuilder

MockMvc 객체를 생성할 때 MockMvcBulider의 standaloneSetup를 사용하게 되면 개별 컨트롤러에 대한 단위 테스트가 가능하고 webAppContextSetup를 사용하게 되면 실제 웹어플리케이션 프로젝트 환경에서 컨트롤러에 대한 통합 테스트가 가능하다.

private MockMvc mockMvc;

@Before
public void setup() {
    this.mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();
}

RequestBuilder

mockMvc를 통한 컨트롤러 테스트는 perform 메소드에 테스트하고 싶은 컨트롤러를 호출하기 위해 설정된 RequestBuilder 객체를 넘겨 실행한 결과로 반환된 ResultActions에 대한 검증을 통해 이뤄진다. RequestBuilder는 HTTP request의 method, pathvariable, query param, body 설정을 지원한다.

@Test
public void testController() {
    this.mockMvc.perform(get("/homePage")).andDo(print())
      .andExpect(view().name("index"));
}

MockMvc 환경 커스터마이징

mockMvcBuilder는 argumentResolver, filter, interceptor, advice 등을 빈으로 등록해 스프링 MVC 테스트 프레임워크 동작 과정 안에서 다양한 테스트 환경을 설정할 수 있도록 지원하고 있다.

setCustomArgumentResolvers

컨트롤러를 호출하기 전에 동작되는 HandlerArgumentResolver를 등록할 수 있어 테스트 환경에서도 request로부터 원하는 객체의 매개변수로 역직렬화 시킬 수 있다.

addFilters

컨트로러가 호출되기 전 request를 처리하는 필터를 등록할 수 있다.

addInterceptors

컨트롤러가 호출되기 전 request를 처리하는 인터셉터를 등록할 수 있다.

addControllerAdvice

컨트롤러가 호출되면서 발생되는 예외처리를 담당하는 객체를 등록할 수 있다.

Filter -> Interceptor -> AOP -> Controller

Filter
서블릿 컨테이너 레벨에서 처리되는 요청에 대한 처리를 담당하고 있어 스프링 MVC가 동작하기 전에 요청에 대한 처리가 동작된다.

Interceptor
스프링 MVC의 디스패처 서블릿에 전달된 요청이 컨트롤러에 전달되기 전에 요청에 대한 처리가 동작되어 Filter보다 나중에 동작하게 되고 컨트롤러보다 전에 동작하게 된다.

ControllerAdvice
컨트롤러를 포인트컷으로 지정한 aop 객체로 호출되는 컨트롤러에 대한 예외처리 동작을 정의하면 컨트롤러가 호출된 후 지정한 예외 클래스가 잡힐 경우 로직이 동작하게 된다.


mockMvcBuilder
filter vs interceptor vs aop

profile
ㅇㅅㅇ

0개의 댓글