[Spring] MockMvc 공부하자!!
오늘은 MockMvc에 대해서 공부를 해보자!
아마도 웹 개발을 하는 사람들은 자주 이용할거라고 생각한다!!
🚗목차
- MockMvc란?
- MockMvc 사용법
- MockMvc 설정
- MockMvc 메서드
MockMvc란?
MockMvc는 웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.
MockMvc는 웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.
다시 풀어서 이야기 하자.
내가 컨트롤러 테스트를 하고싶을 때 실제 서버에 구현한 애플리케이션을 올리지 않고(실제 서블릿 컨테이너를 사용하지 않고) 테스트용으로 시뮬레이션하여 MVC가 되도록 도와주는 클래스다!
🧐MockMvc 사용법
컨트롤러를 테스트한다고 가정하자!
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에게 요청에 대한 정보를 입력한다.
- 요청에 대한 응답값을 Expect를 이용하여 테스트한다.
- Expect가 모두 통과하면 테스트 통과
- Expect가 1개라도 실패하면 테스트 실패
🧐MockMvc 설정
MockMvc에 대한 설정들이 어떤게 있는지 살펴보자.
MockMvc는 각종 어노테이션을 지원한다.
🌈ContextHierychy
테스트용 DI 컨테이너 만들 때 Bean 파일을 지정한다.
@ContextHierarchy({
@ContextConfiguration(classes = AppConfig.class),
@ContextConfiguration(classes = WebMvcConfig.class)
})
🌈WebAppConfiguration
Controller 및 web 환경에 사용되는 빈을 자동으로 생성하여 등록
🌈단독 실행
public class WelcomeControllerTest {
MockMvc mockMvc;
@Before
public void setUpMockMvc() {
this.mockMvc = MockMvcBuilders.standaloneSetup(new WelcomeController()).build();
}
}
"WelcomController"만 테스트한다는 의미이다. 단위 테스트에서 자주 쓰인다. 대상 Controller를 커스텀 할 수 있다.
🌈MockMvc 필터 추가
addFilter()로 필터를 추가할 수 있다.
class testt(){
MockMvc mockMvc;
@Before
public void setUpMockMvc(){
this.mockMvc = MockMvcBuilders
.standaloneSetup(TestController.class)
.addFilter(new SessionFilter()) //필터 추가
.build();
{
}
🧐MockMvc 실행
🔎 MockMvc를 실행하는 방법을 알아보자.
perform()을 이용하여 설정한 MockMvc를 실행할 수 있다.
@Test
public void testController() throws Exception{
mockMvc.perform(
get("test?query=food")
);
-
perform에 요청 설정 메서드를 통해성 요청에 대한 설정을 할 수 있다.
-
perform에 Expect 메서드를 통해서 테스트를 진행할 수 있다.
🧐MockMvc 요청 설정 메소드
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 하게 된다.
🧐MockMvc 기타 메소드
요청 설정, 검증 설정 메소드가 아닌 기타 메소드도 존재한다.
-
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());
🧐속성 및 사용법 추가정리
🌈응답 생태코드
- isOk() : 상태 코드가 200인지 확인
- isNotFount() : 404인지 확인
- isMethodNotAllowed() : 405인지 확인
- isInternalServerError() : 500인지 확인
- is(int status) : 임의로 지정한 상태 코드인지 확인
🌈모델 검증 속성
.andExpect(model().atrribute("userId", "fly123"))
-
attributeExists(String key) : key에 해당하는 데이터가 model에 있는지 검증
-
attribute(String key, Object value1) : key에 해당하는 value가 입력해준 "value1"과 일치한지 확인
🌈뷰 이름 검증
.andExpect(view().name("home"));
- name(String viewName) : 응답된 뷰 이름이 viewName과 일치한지 확인
🌈리다이렉트 검증
.andExpect(redirectedUrl("/foodList?name=부대찌개"));
📋마치며
요청 설정, 검증 설정 메소드가 아닌 기타 메소드도 존재한다.
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());
🌈응답 생태코드
- isOk() : 상태 코드가 200인지 확인
- isNotFount() : 404인지 확인
- isMethodNotAllowed() : 405인지 확인
- isInternalServerError() : 500인지 확인
- is(int status) : 임의로 지정한 상태 코드인지 확인
🌈모델 검증 속성
.andExpect(model().atrribute("userId", "fly123"))
-
attributeExists(String key) : key에 해당하는 데이터가 model에 있는지 검증
-
attribute(String key, Object value1) : key에 해당하는 value가 입력해준 "value1"과 일치한지 확인
🌈뷰 이름 검증
.andExpect(view().name("home"));
- name(String viewName) : 응답된 뷰 이름이 viewName과 일치한지 확인
🌈리다이렉트 검증
.andExpect(redirectedUrl("/foodList?name=부대찌개"));
📋마치며
MockMvc를 새롭게 사용해보면서, 신세계를 느꼈다..
정말 한계가 없구나..
수많은 테스트를 앞으로 진행하게 될텐데 수많은 테스트 지원 객체들이 있을 것이다. 한편으로는 설레고 한편으로는 걱정된다..
구글 신 도와주세요 !!
🧷Reference
- https://itmore.tistory.com/entry/MockMvc-%EC%83%81%EC%84%B8%EC%84%A4%EB%AA%85
- https://ktko.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81Spring-MockMvc-%ED%85%8C%EC%8A%A4%ED%8A%B8
- https://goodteacher.tistory.com/257
Author And Source
이 문제에 관하여([Spring] MockMvc 공부하자!!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@jkijki12/Spring-MockMvc
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Author And Source
이 문제에 관하여([Spring] MockMvc 공부하자!!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jkijki12/Spring-MockMvc저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)