본문 바로가기
스프링/JUnit

[Junit] MockMvc 객체란?

by 책 읽는 개발자_테드 2021. 4. 29.
반응형

MockMvc 객체란?

· 서블릿 컨테이너의 구동 없이, 시뮬레이션된 MVC 환경에 모의 HTTP 서블릿 요청을 전송하는 기능을 제공하는 유틸리티 클래스다.

 

다음과 같이 MockMvc가 제공하는 메소드를 이용해서 스프링 웹 어플리케이션 프로젝트의 Controller를 테스트하는 코드가 있다. 이 코드를 살펴보며 MockMvc가 제공하는 메소드를 알아보자.

 

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
class UserControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testUserIntroduction() throws Exception {
        String content = "{\"name\": \"Ted\", \"hobby\": \"만들기\"}";

        mockMvc.perform(get("/users/introduction")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(content))
                .andExpect(status().isOk())
                .andExpect(content().string("안녕하세요. 저의 이름은 Ted입니다. 저의 취미는 만들기입니다."))
                .andDo(print());
    }
}

 

perform()

· MockMvc가 제공하는 메서드로, 브라우저에서 서버에 URL 요청을 하듯 컨트롤러를 실행시킬 수 있다.

- perform() 메소드는 RequestBuilder 객체를 인자로 받고, 이는 MockMvcRequestBuilders의 정적 메소드를 이용해서 생성한다. 

 

MvckMvcRequestBuilders

· MvckMvcRequestBuilders의 메소드들은 GET, POST, PUT, DELETE 요청 방식과 매핑되는 get(), post(), put(), delete() 메소드를 제공한다.

- 이 메소드들은 MockHttpServletRequestBuilder 객체를 리턴하고, 이를 통해 HTTP 요청 관련 정보(파라미터, 헤더, 쿠키 등)를 설정할 수 있다.

- MockHttpServletRequestBuilder의 메소드는 MockHttpServletRequestBuilder 객체를 다시 리턴하여 메시지 체인을 구성하여 복잡한 요청을 설정할 수도 있다.

 

contentType()

· 요청 헤더의 content type 설정

 

content()

· 요청 바디의 content 설정

 

andExpect()

· perform() 메소드를 이용하여 요청을 전송하면, 그 결과로 ResultActions 객체를 리턴하는데 이 객체는 응답 결과를 검증할 수 있는 andExpect() 메소드를 제공한다.

· andExpect()가 요구하는 ResultMatcherMockMvcResultMatchers에 정의된 정적 메소드를 통해 생성할 수 있다.

- MockMvcResultMatcher 객체는 컨트롤러가 어떤 결과를 전송했는지, 서버의 응답 결과를 검증한다.

 

MockMvcResultMatcher 객체가 제공하는 메소드

응답 상태 코드 검증

isOk() 응답 상태 코드가 정상적인 처리(200)인지 확인
isNotFount() 응답 상태 코드가 404 Not Found인지 확인
isMethodNotAllowed() 응답 상태 코드가 메소드 불일치(405)인지 확인
isInternalServerError() 응답 상태 코드가 예외발생(500)인지 확인
is(int status) 몇 번 응답 상태 코드가 설정되었는지 확인 ex) is(200), is(404)

 

뷰/리다이렉트 검증

· 컨트롤러가 리턴하는 뷰를 검증할 때는 view() 메소드를 사용한다. andeExpect(view().name("user")) 코드는 컨트롤러가 리턴한 뷰 이름이 "hello"인지 검증한다.

 

· 만약 요청 처리 결과가 리다이렉트 응답이면 redirectedUrl() 메소드를 사용한다. andExpect(redirectedUrl("/user")) 코드는 '/user' 화면으로 리다이렉트했는지 검증한다.

 

모델 정보 검증

· 컨트롤러에서 저장한 모델의 정보를 검증하고 싶다면 MockMvcResultMatchers.model() 메소드를 사용한다.

attributeExists(String name) name에 해당하는 데이터가 Model에 포함되어 있는지 검증
attribute(String name, Object value) name에 해당하는 데이터가 value 객체인지 검증

 

요청/응답 전체 메시지 확인하기

· 생성된 요청과 응답 메시지를 모두 확인해보고 싶다면, perform 메소드가 리턴하는 ResultAction의 andDo(ResultHandler handler) 메소드를 사용한다. 

 

· MockMvcResultHandlers.print() 메소드는 ResultHandler를 구현한 ConsolerPrinting ResultHandler 객체를 리턴하여, ConsolePrintingResultHandler를 andDo() 메소드 인자로 넘겨주면 콘솔에 요청/응답과 관련된 정보를 모두 출력한다.

 

 

출처

스프링 퀵 스타트

examples.javacodegeeks.com/spring-boot-mockmvc-tutorial/

반응형

댓글