MockMVC이란
MockMVC는 spring MVC 테스트 시 가짜 객체를 만들어, 서버를 직접 실행 시키지 않아도, Spring MVC동작을 재현해주는 클래스이다.
MockMVC 객체를 통해, 클라이언트의 HTTP Request를 가정하고, 그에 따른, 서버의 HTTP Response를 테스트할 수 있다.
MockMVC 테스트 예시
아래의 /api/message URI를 GET하면 ok상태 코드와 hello JSON메세지를 돌려주는 간단한 Controller를 테스트 해보겠다.
@RestController
public class GetController {
@GetMapping("/api/message")
public ResponseEntity getFromMessage() {
String jsonMessage = "{\"message\":\"hello\"}";
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(jsonMessage);
}
}
<테스트 코드>
@SpringBootTest
class GetControllerTest {
@Autowired
private GetController getController;
private MockMvc mockMvc;
ObjectMapper objectMapper;
@BeforeEach
void init() {
mockMvc = MockMvcBuilders.standaloneSetup(getController).build();
objectMapper = new ObjectMapper();
}
@Test
void getFromMessage() throws Exception {
//given
String jsonMessage = "{\"message\":\"hello\"}";
//when
var request = MockMvcRequestBuilders
.get("/api/message");
//then
mockMvc
//perfrom()에 들어올 Request를 가정한다.
.perform(request)
//perform()에서 가정한 Request에 대한
//Response를 andExpect()에서 예측하고 테스트한다.
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().json(jsonMessage))
.andExpect(MockMvcResultMatchers.header().string("Content-Type", "application/json"))
//andDo() 실행 결과 값을 출력한다.
.andDo(MockMvcResultHandlers.print());
}
GET이외에 다른 메소드를 테스트 할 때는 get(”/api/message”) 대신에 아래와 같이 다른 메소드를 넣어준다.
var request = MockMvcRequestBuilders
.post("/api/message");
var request = MockMvcRequestBuilders
.delete("/api/message");
MockMvc의 핵심 기능은 세 가지이다.
- perform() - 해당 컨트롤러에 요청하는 가짜 Request를 설정한다.
- andExpect() - 가짜 Requets에 대한 Response 예측을 작성하고 평가한다.
- andDo() - 실행 결과 값을 출력한다.
이제, 핵심 기능 중에서 perform() 요청 메소드와 andExpect()검증 메소드를 구체적으로 설정하는 방법을 알아보자.
MockMvc Request 가정하기
위 그림 예시 같은 Request Message를 가정한다.
- param / params : 쿼리 스트링 설정
- cookie : 쿠키 설정
- requestAttr : 요청 스코프 객체 설정
- sessionAttr : 세션 스코프 객체 설정
- content : 요청 본문 설정
- header / headers : 요청 헤더 설정
- contentType : 본문 타입 설정
@Test
public void testController() throws Exception{
mockMvc.perforem(get("/api/test"))
.param("key", "value")
.cookie("쿠키 값")
.header("헤더 값:)
.contentType(MediaType.APPLICATION.JSON)
.content("{\"message\":\"json\"}");
}
MockMvc Response Message 가정하고 테스트하기
위 그림 예시의 Response Message를 설정하고 검증 받는다.
- status : 상태 코드 검증
- header : 응답 header 검증
- content : 응답 본문 검증
- cookie : 쿠키 상태 검증
- view : 컨트롤러가 반환한 뷰 이름 검증
- redirectedUrl(Pattern) : 리다이렉트 대상의 경로 검증
- model : 스프링 MVC 모델 상태 검증
- request : 세션 스코프, 비동기 처리, 요청 스코프 상태 검증
- forwardedUrl : 이동대상의 경로 검증
@Test
public void testController() throws Exception{
mockMvc.perform(request)
.andExpect(status().isOk()) // Response status가 isOk인지 검증한다.
.andExpect(content().string("expect 값"));
Reference
'Web Sever 개발과 CS 기초 > 스프링' 카테고리의 다른 글
RFC7807가 제시한 오류 메시지 생성하기 (0) | 2022.11.07 |
---|---|
Spring MVC 구조와 사용법 (0) | 2022.09.24 |
스프링 컨테이너와 빈에 대한 이해 (0) | 2022.09.24 |
스프링 POJO 기반 구성 (0) | 2022.09.24 |
Spring MVC 패턴이란 (0) | 2022.09.18 |