오늘은 MockMvc에 대해서 공부를 해보자!
아마도 웹 개발을 하는 사람들은 자주 이용할거라고 생각한다!!
MockMvc는 웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.
다시 풀어서 이야기 하자.
내가 컨트롤러 테스트를 하고싶을 때 실제 서버에 구현한 애플리케이션을 올리지 않고(실제 서블릿 컨테이너를 사용하지 않고) 테스트용으로 시뮬레이션하여 MVC가 되도록 도와주는 클래스다!
컨트롤러를 테스트한다고 가정하자!
class ControllerTest{
@Autowired
private MockMvc mockMvc; // mockMvc 생성
@Test
public void testController() throws Exception{
String jjson = "{\"name\": \"부대찌개\"}";
//mockMvc에게 컨트롤러에 대한 정보를 입력하자.
mockMvc.perform(
get("test?query=food") //해당 url로 요청을 한다.
.contentType(MediaType.APPLICATION_JSON) // Json 타입으로 지정
.content(jjson) // jjson으로 내용 등록
.andExpect(status().isOk()) // 응답 status를 ok로 테스트
.andDo(print()); // 응답값 print
)
}
}
MockMvc에 대한 설정들이 어떤게 있는지 살펴보자.
MockMvc는 각종 어노테이션을 지원한다.
테스트용 DI 컨테이너 만들 때 Bean 파일을 지정한다.
@ContextHierarchy({
@ContextConfiguration(classes = AppConfig.class),
@ContextConfiguration(classes = WebMvcConfig.class)
})
Controller 및 web 환경에 사용되는 빈을 자동으로 생성하여 등록
public class WelcomeControllerTest {
MockMvc mockMvc;
@Before
public void setUpMockMvc() {
this.mockMvc = MockMvcBuilders.standaloneSetup(new WelcomeController()).build();
}
}
"WelcomController"만 테스트한다는 의미이다. 단위 테스트에서 자주 쓰인다. 대상 Controller를 커스텀 할 수 있다.
addFilter()로 필터를 추가할 수 있다.
class testt(){
MockMvc mockMvc;
@Before
public void setUpMockMvc(){
this.mockMvc = MockMvcBuilders
.standaloneSetup(TestController.class)
.addFilter(new SessionFilter()) //필터 추가
.build();
{
}
🔎 MockMvc를 실행하는 방법을 알아보자.
perform()을 이용하여 설정한 MockMvc를 실행할 수 있다.
@Test
public void testController() throws Exception{
mockMvc.perform(
get("test?query=food")
);
perform에 요청 설정 메서드를 통해성 요청에 대한 설정을 할 수 있다.
perform에 Expect 메서드를 통해서 테스트를 진행할 수 있다.
MockMvc는 요청에 대한 설정을 할 수 있다.
🔎요청에 대한 설정을 알아보자.
param / params : 쿼리 스트링 설정
cookie : 쿠키 설정
requestAttr : 요청 스코프 객체 설정
sessionAttr : 세션 스코프 객체 설정
content : 요청 본문 설정
header / headers : 요청 헤더 설정
contentType : 본문 타입 설정
@Test
public void testController() throws Exception{
mockMvc.perforem(get("test"))
.param("query", "부대찌개")
.cookie("쿠키 값")
.header("헤더 값:)
.contentType(MediaType.APPLICATION.JSON)
.content("json으로");
}
방금 전에는 요청에 대한 설정 메소드를 보았다.
🔎이제 응답에 대한 검증 메소드를 살펴보자.
status : 상태 코드 검증
header : 응답 header 검증
content : 응답 본문 검증
cookie : 쿠키 상태 검증
view : 컨트롤러가 반환한 뷰 이름 검증
redirectedUrl(Pattern) : 리다이렉트 대상의 경로 검증
model : 스프링 MVC 모델 상태 검증
request : 세션 스코프, 비동기 처리, 요청 스코프 상태 검증
forwardedUrl : 이동대상의 경로 검증
@Test
public void testController() throws Exception{
mockMvc.perform(get("test"))
.param("query", "부대찌개")
.cooke("쿠키 값")
.header("헤더 값:)
.contentType(MediaType.APPLICATION.JSON)
.content("json으로")
.andExpect(status().isOk()) // 여기부터 검증
.andExpect(content().string("expect json값"))
.andExpect(view().string("뷰이름"));
위와 같이 하면
status 검증 -> conten 검증 -> view 검증 순으로 실시한다.
1개라도 통과되지 않으면 테스트는 fail 하게 된다.
요청 설정, 검증 설정 메소드가 아닌 기타 메소드도 존재한다.
andDo() : print, log를 사용할 수 있는 메소드
print() : 실행결과를 지정해준 대상으로 출력, default = System.out
log() : 실행결과를 디버깅 레벨로 출력, 레벨은 org.springframework.test.web.servlet.result
@Test
public void testController() throws Exception{
mockMvc.perforem(get("test"))
.param("query", "부대찌개")
.cookie("쿠키 값")
.header("헤더 값:)
.contentType(MediaType.APPLICATION.JSON)
.content("json으로")
.andExpect(status().isOk())
.andExpect(content().string("expect json값"))
.andExpect(view().string("뷰이름"))
.andDo(print()) //여기부터 기타 메소드
.andDo(log());
.andExpect(model().atrribute("userId", "fly123"))
attributeExists(String key) : key에 해당하는 데이터가 model에 있는지 검증
attribute(String key, Object value1) : key에 해당하는 value가 입력해준 "value1"과 일치한지 확인
.andExpect(view().name("home"));
.andExpect(redirectedUrl("/foodList?name=부대찌개"));
MockMvc를 새롭게 사용해보면서, 신세계를 느꼈다..
정말 한계가 없구나..
수많은 테스트를 앞으로 진행하게 될텐데 수많은 테스트 지원 객체들이 있을 것이다. 한편으로는 설레고 한편으로는 걱정된다..
구글 신 도와주세요 !!
Github 링크가 잘못 걸려 있는것 같습니다. 404 error가 나오고 주소창에 아래의 url로 나옵니다.
https://github.com/https://github.com/Cha-Young-Ho
잘 읽었습니다.