학습 목표
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());
}
}
▽ 도움을 주신 분들
+ 코드로 배우는 스프링 웹 프로젝트
'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 |