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()가 요구하는 ResultMatcher는 MockMvcResultMatchers에 정의된 정적 메소드를 통해 생성할 수 있다.
- 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() 메소드 인자로 넘겨주면 콘솔에 요청/응답과 관련된 정보를 모두 출력한다.
출처
스프링 퀵 스타트
'스프링 > JUnit' 카테고리의 다른 글
[Junit] AssertJ란? (0) | 2021.10.30 |
---|---|
[JUnit] 오류 해결: java.lang.IllegalStateException: Failed to load ApplicationContext (0) | 2021.08.10 |
[JUnit] JUnit 5로 자바 단위 테스트 시작하기 (0) | 2021.04.27 |
[JUnit] JUnit5 테스트를 반복 실행하는 방법(@RepeaedTest, @ParameterizedTest) (0) | 2020.12.15 |
[JUnit] JUnit5 테스트 이름 표시하기 (0) | 2020.12.14 |
댓글