JVM/JUnit

[JUnit] 소개 - 6. MockMVC 란 ?

헹창 2023. 9. 30.
반응형

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
  • print

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
반응형

댓글

추천 글