학습 목표
MockMvc를 활용해서 테스트 코드를 작성하는 방법에 대해 알아보자.
MockMvc란?
웹 애플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답 기능을 제공해주는 유틸리티 클래스이다.
즉, 실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 가짜 객체를 만들어서 스프링 MVC 동작을 재현할 수 있도록 하는 클래스를 의미한다.
의존성 추가
- gradle
testImplementation 'org.springframework.boot:spring-boot-starter-test'
- maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
(필자는 스프링 부트 프로젝트를 생성할 때마다 해당 의존성이 추가되어 있었기 때문에 따로 의존성을 추가하지 않았지만 혹시 추가되어 있지 않은 분들도 있을 거라고 생각하고 따로 남겨놓았다.)
MockMvc의 메서드
○ perform()
- MockMvc가 제공하는 메서드로, 브라우저에서 서버에 요청을 하듯 컨트롤러를 실행할 수 있다.
- perform() 메서드는 RequestBuilder 객체를 인자로 받는다. 그리고 이는 MockMvcRequestBuilder의 정적 메서드를 이용해서 생성한다.

MockMvcRequestBuilder
- GET, POST, PUT, DELETE 요청 방식과 매핑되는 get(), post(), put(), delete() 메서드를 제공한다.
- 해당 메서드들은 MockHttpServletRequestBuilder 객체를 반환하고, HTTP 관련 요청 정보를 설정할 수 있다.
○ contentType()
- 전달되는 데이터의 타입을 요청 Header에 설정한다.
○ content()
- 요청 Body에 전달할 데이터를 설정한다.
○ andExpect()
- .perform() 메서드를 이용해서 요청을 전송하면, 그 결과로 ResultActions 객체를 리턴하는데 이 객체는 응답 결과를 검증할 수 있는 andExpect() 메서드를 제공한다.

- andExpect()가 필요로 하는 ResultMatcher는 MockMvcResultMatchers로 정의된 정적 메서드를 통해 생성할 수 있다.
상태 코드(status())
- isOk() : 응답 상태 코드가 정상적인 처리(200)인지 확인.
- isNotFound() : 응답 상태 코드가 Not Found인지 확인.
- isMethodNotAllowed() : 응답 상태 코드가 메소드 불일치인지 확인.
- isInternerServerError() : 응답 상태 코드가 예외 발생인지 확인.
- is(int status) : 몇 번 응답 코드가 설정되었는지 확인.
뷰(view())
- 리턴하는 뷰 이름을 검증.
- 예시) view().name("home") : 리턴하는 뷰 이름이 'home'이 맞는지?
리다이렉트(redirectUrl())
- 리다이렉트 응답을 검증.
- 예시) redirectUrl("/") : '/' 리다이렉트 되었는지?
모델(model())
- 컨트롤러에서 저장한 모델을 검증.
응답 정보(content())
- 응답에 대한 정보를 검증.
○ andDo()
- 생성된 요청과 응답 메시지를 모두 확인하고 싶다면 ResultActions의 andDo() 메서드를 활용.
예제
SampleController.java
@RestController
@RequestMapping("/sample")
public class SampleController {
@GetMapping("/Test")
public String Test1(){
return "Main";
}
@GetMapping("/Test2")
public String Test2( String name , String age){
return "이름은" + name +"나이는" + age ;
}
}
SampleTest.java
@WebMvcTest // @SpringBootTest하면 에러 발생.
public class SampleTest {
@Autowired
private MockMvc mockMvc;
@Test
public void MockMvc_테스트1() throws Exception{
mockMvc.perform(get("/sample/Test")) // get방식으로 ("/sample/Test") 요청
.andExpect(status().isOk()) // 응답 상태 코드가 200인가? 검증
.andExpect(content().string("Main")) // 응답 내용이 "Main"인가? 검증
.andDo(print()); // 요청과 응답 메시지 모두 보여줌
}
@Test
public void MockMvc_테스트2() throws Exception {
MultiValueMap<String, String> info = new LinkedMultiValueMap<>();
info.add("name","자바썸");
info.add("age","10");
mockMvc.perform(get("/sample/Test2")
.params(info)) // 파라미터가 1개면 param()을 사용.
.andExpect(status().isOk())
.andExpect(content().string("이름은자바썸나이는10"))
.andDo(print());
}
}
▽ 도움을 주신 분들
MockMvc 넌 또 뭐하는 애야?
MockMvc, TDD
velog.io
[Junit] MockMvc 객체란?
MockMvc 객체란? · 서블릿 컨테이너의 구동 없이, 시뮬레이션된 MVC 환경에 모의 HTTP 서블릿 요청을 전송하는 기능을 제공하는 유틸리티 클래스다. 다음과 같이 MockMvc가 제공하는 메소드를 이용해
scshim.tistory.com
SpringBoot의 MockMvc를 사용하여 GET, POST 응답 테스트하기
안녕하세요! 이번 포스팅에서는 SpringBoot 프레임워크에서 제공해주는 MockMvc를 만들고 테스트하는 방법을 알아보도록 하겠습니다. 전체 코드는 Github에서 확인이 가능합니다. ✍️ 📚 개념 정리
shinsunyoung.tistory.com
+ 코드로 배우는 스프링 웹 프로젝트

'Spring > Spring' 카테고리의 다른 글
[Spring] Spring Triangle? 그게 뭔데 - PSA (0) | 2022.07.05 |
---|---|
[Spring] Spring Triangle? 그게 뭔데 - IoC/DI (0) | 2022.06.30 |
[Spring] Spring Triangle? 그게 뭔데 - AOP (0) | 2022.06.29 |
[Spring] 인터셉터(Interceptor)에 대해 알아보자! (0) | 2022.06.28 |
[Spring] Filter에 대해 알아보자 ! (0) | 2022.06.24 |