MockMvc

배세훈·2022년 1월 16일
0

Spring

목록 보기
32/38

MockMvc란?

  • 실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 가짜 객체를 만들어서 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스를 의미합니다.

사용방법

Junit4를 사용하기 위해 의존성에 spring-boot-starter-test를 추가해줍니다.

  • build.gradle
    testCompile("org.springframework.boot:spring-boot-starter-test")

GET 방식 사용하기

1. Controller 추가

  • MockMvcController.java
@RestController
@RequestMapping("/mockmvc")
public class MockMvcController {

    @GetMapping("")
    public String mockGet(@RequestParam String name, @RequestParam String id){
        return name + "의 MockMvc 테스트입니다. " + id;
    }
}

2. Test 추가

@WebMvcTest(MockMvcController.class)
class MockMvcControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test_get() throws Exception {

        MultiValueMap<String, String> info = new LinkedMultiValueMap<>();

        info.add("name", "shbae");
        info.add("id", "shbae94");

        mockMvc.perform(get("/mockmvc")
                .params(info))
                .andExpect(status().isOk())
                .andExpect(content().string("shbae의 MockMvc 테스트입니다. shbae94"))
                .andDo(print());
    }
}

3. 결과

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /mockmvc
       Parameters = {name=[shbae], id=[shbae94]}
          Headers = []
             Body = null
    Session Attrs = {}

Handler:
             Type = com.fastcampus.mock.controller.MockMvcController
           Method = com.fastcampus.mock.controller.MockMvcController#mockGet(String, String)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"44"]
     Content type = text/plain;charset=UTF-8
             Body = shbae의 MockMvc 테스트입니다. shbae94
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
BUILD SUCCESSFUL in 28s

4. mockMvc의 메소드

1) perform()

  • 요청을 전송하는 역할을 합니다. 결과로 ResultActions 객체를 받으며 ResultActions 객체는 리턴값을 검증하고 확인할 수 있는 andExpect() 메소드를 제공해줍니다.

2) get("/mockmvc")

  • HTTP 메소드를 결정할 수 있습니다. (get(), post(), put(), delete())
  • 인자로는 경로를 보내줍니다.

3) params(info)

  • 키=값의 파라미터를 전달할 수 있습니다.
  • 여러개일때는 params()를 하나일 때에는 param()을 사용합니다.

4) andExpect()

  • 응답을 검증하는 역할을 합니다.
  • 상태코드 (status())
    - 메소드 이름: 상태코드
    • isOk(): 200
    • isNotFound(): 404
    • isMethodNotAllowed(): 405
    • isInternalServerError(): 500
    • is(int status): status 상태 코드
  • 뷰 (view())
    - 리턴하는 뷰 이름을 검증합니다.
    • ex) view().name("mockview"): 리턴하는 뷰 이름이 mockview 인가?
  • 리다이렉트 (redirect())
    - 리다이렉트 응답을 검증합니다.
    • ex) redirectUrl("/mock") : '/mock'로 리다이렉트 되었는가?
  • 모델 정보 (model())
    - 컨트롤러에서 저장한 모델들의 정보 검증
  • 응답 정보 검증(content())
    - 응답에 대한 정보를 검증해줍니다.

5) andDo(print())

  • 요청/응답 전체 메세지를 확인할 수 있습니다.

5. Post 사용하기

1. VO 추가

public class Info{
	private String name;
    private String id;
    
    public Info(String name, String id){
    	this.name = name;
        this.id = id;
    }
    
    public String getName(){
    	return name;
    }
    public String getId(){
    	return id;
    }
}

2. Controller 추가

@RestController
@RequestMapping("mock")
public class MockController {

    @PostMapping
    public String MockPost(@RequestBody Info info){
        return info.getName()+"님의 테스트입니다. " + info.getId();
    }

}

3. Test 추가

@WebMvcTest(MockController.class)
class MockControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private WebApplicationContext ctx;

    @BeforeEach
    public void setup(){
        mockMvc = MockMvcBuilders.webAppContextSetup(ctx)
                .addFilters(new CharacterEncodingFilter("UTF-8", true)) // 한글 깨짐 처리
                .build();
    }

    @Test
    public void test_post() throws Exception{

        String param = objectMapper.writeValueAsString(new Info("shbae", "shbaeTest"));

        mockMvc.perform(post("/mock")
                .content(param)
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string("shbae님의 테스트입니다. shbaeTest"))
                .andDo(print());

    }

}

4. 결과

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /mock
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Accept:"application/json", Content-Length:"33"]
             Body = {"name":"shbae","id":"shbaeTest"}
    Session Attrs = {}

Handler:
             Type = com.fastcampus.mockmvc.controller.MockController
           Method = com.fastcampus.mockmvc.controller.MockController#MockPost(Info)

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"41"]
     Content type = application/json;charset=UTF-8
             Body = shbae님의 테스트입니다. shbaeTest
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
BUILD SUCCESSFUL in 11s
4 actionable tasks: 2 executed, 2 up-to-date
오후 7:09:41: Task execution finished ':test --tests "com.fastcampus.mockmvc.controller.MockControllerTest.test_post"'.
profile
성장형 인간

0개의 댓글