반응형
MockMVC
- 테스트 코드를 작성하지 않은 경우, 포스트맨 등의 도구를 사용해 직접 호출해 서버를 디버깅해야하는데 MockMVC를 사용하면 이 과정을 건너뛸 수 있다
- 쉽게 말해, 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고도 스프링 MVC의 동작을 재현하여 컨트롤러를 호출해주는 클래스이다.
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@AutoConfigureMockMvc
MockMVC Method 요약
method | 설명 | |
perform | 요청 전송 시 사용 | - 결과 값으로 ResultAction 객체를 받음 - 이 객체는 반환 값 검증하는 andExpect 메소드 제공 |
get/post/delete/put/patch | HTTP method 결정 | - 파라미터로 URL 경로 매칭 - contentType(MediaType type) : json parse - content(ObjectMapper) : 요청 컨텐츠 contentType으로 변경되어 body에 들어감 |
param/params | 쿼리스트링 파라미터 세팅 | - param : 파라메터 한 개 - params : 파라메터 여러 개 설정 |
andExpect | 응답 검증 | - status : 상태 코드 검증 - view : 뷰이름 검증 - redirect : 리다이렉트 검증 - model : 컨트롤러에서 저장한 모델들의 정보 검증 - content : 응답정보에 대한 검증 |
andDo(print()) | 테스트 응답 결과 출력 | |
andReturn | MvcResult 반환 |
Example (MockMvc)
@SpringBootTest
@AutoConfigureMockMvc
public class MockMvcTest {
@Autowired
public MockMvc mvc;
@Test
void test1() {
HttpHeaders headers = new HttpHeaders();
ResultActions actions = mvc.perform(
MockMvcRequestBuilders.get("/users")
.accept(MediaType.APPLICATION_JSON)
.headers(headers)
.param("name", "haenny")
)
.andDo(print())
.andExpect(status().isOk());
}
@Test
void test2() {
HttpHeaders headers = new HttpHeaders();
MvcResult result = mvc.perform(
MockMvcRequestBuilders.get("/users")
.accept(MediaType.APPLICATION_JSON)
.headers(headers)
.param("name", "haenny")
)
.andDo(print())
.andExpect(status().isOk())
.andReturn();
// result.getResponse().getStatus();
}
@Test
void test3() {
HttpHeaders headers = new HttpHeaders();
// ...
User suer = new User();
// ...
ObjectMapper objectMapper = new ObjectMapper();
MvcResult result = mvc.perform(
MockMvcRequestBuilders.post("/users")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.headers(headers)
.content(objectMapper.writeValueAsString(user))
)
.andDo(print())
.andExpect(status().isOk())
.andReturn();
}
}
Example (andExpect)
.andExpect(status().isOk()) // status : 200 코드인지 검증
.andExpect(view().name("hello")) // view : 컨트롤러가 리턴한 뷰 이름이 hello인지 검증
.andExepct(redirectedUrl("/index")) // redirect: "/index" 화면으로 리다이렉트 했는지 검증
.andExepct(model().attribute("value", "1") // model : model attribute 검증
.andExpect(content().string("Hello")) // content : 응답 본문에 Hello 문자열 있는 지 검증
MockMVC 그 외 메소드
MockMvcRequestBuilders 메소드 (참고)
- get / post / delete / put / patch
- param / params
- session ( MockHttpSession ) : 재 사용 가능한 HTTP session 설정
- accept : Accept 헤더 설정
ResultActions 메소드
perform 함수의 리턴 값이 ResultActions 인터페이스이다.
- andDo ( ResultHandler ) : 동작을 수행할 때 사용 (ResultActions 리턴)
- andExpect ( ResultMatcher ) : 결과 값 예상 (ResultActions 리턴)
- andReturn : 요청 실행한 결과를 MvcResult 타입으로 리턴
MockMvcResultHandlers 메소드
andDo 함수의 파라미터인 ResultHandler 인터페이스를 구현한 클래스
- log
MockMvcResultMatchers
andExpect 함수의 파라미터 ResultMatcher 인터페이스를 구현한 클래스
- StatusResultMatchers status : 응답 상태 검증
- ModelResultMatchers model : 모델에 접근해 모델 객체 검증
- ResultMatcher redirectedUrl : 해당 URL로 정상 리다이렉트 되었는 지 검증
- <T> ResultMatcher jsonPath : jsonPath 표현식을 이용하여 response body에 접근하여 검증하고, 찾은 JSON 값을 검증하는 방법으로 Hancrest matcher를 이용
MvcResult 메소드
andReturn() 함수를 이용해 반환
- HandlerInterceptor[] getInterceptors : 핸들러에 있는 인터셉터들을 리턴
- ModelAndView getModelAndView : 핸들러에 의해 준비된 ModelAndView 리턴
- MockHttpServletRequest getRequest : perform 함수 실행하고 난 request 객체 리턴
- MockHttpServletResponse getResponse : 응답 결과를 리턴
(ETC) JsonPath 이용한 검증 (참고)
값의 존재 여부 검증
.andExpect(jsonPath("$.isObsBucketNameDuplicated").exists()) // isObsBucketNameDuplicated 존재하는지
.andExpect(jsonPath("$.isObsBucketNameDuplicated").doesNotExists()) // isObsBucketNameDuplicated 존재하지 않는지
값의 동일한 지 비교
.andExpect(jsonPath("$.isObsBucketNameDuplicated").value(false)) // isObsBucketNameDuplicated 이 false 인지
728x90
반응형
'JVM > JUnit' 카테고리의 다른 글
[JUnit] JUnit의 Rollback 수행 관리 (1) | 2023.10.03 |
---|---|
[JUnit] 소개 - 5. BDDMockito 란? (0) | 2023.09.27 |
[JUnit] 소개 - 4. Mokitio 란 ? (1) | 2023.09.26 |
[JUnit] 소개 - 3. Annotation (TestInstance, TestMethodOrder, Tag) (0) | 2023.09.21 |
[JUnit] 소개 - 2. Assertion 과 Assumption (0) | 2022.11.01 |
댓글