MockMvc
는 웹 어플리케이션을 서버에 배포하지 않고도 Spring MVC의 동작을 재현하여 테스트 할 수 있는 클래스를 의미한다.
이는 실제 객체와 비슷하지만 테스트에 필요한 기능만 가지고 있는 가짜 객체를 만들어 사용하는 방법이다.
Eclipse에서 Spring Starter Project를 만들면, 기본 라이브러리로 spring-boot-starter-test
가 포함된다.
해당 설정이 되어있지 않다면, pom.xml에 아래 내용을 추가하면 된다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
설정이 완료되면 아래 이미지처럼
src/test/java
디렉토리 내부 프로젝트명 패키지 하단에 Test 파일이 생긴 것을 확인할 수 있다.
ApplicationTests 클래스 하단에 테스트 할 Controller와 MockMvc를 선언,
@Autowired
를 통해 자동으로 의존성을 주입한다.
MockMvc 객체를 초기화하고 테스트를 진행하도록 MockMvc를 초기화하는 메서드 작성,
@BeforeEach
애노테이션을 통해 매 테스트 이전에 해당 메소드가 실행되도록 설정한다.
GET
: mock.perform(get("/test")).andExpect(status().isOk()).andDo(print());
POST
: mock.perform(post("/test")).andExpect(status().isOk()).andDo(print());
PUT
: mock.perform(put("/test")).andExpect(status().isOk()).andDo(print());
DELETE
: mock.perform(delete("/test")).andExpect(status().isOk()).andDo(print());
parameter가 없을 때
: mock.perform(get("/test")).andExpect(status().isOk()).andDo(print());
parameter가 있을 때
: mock.perform(get("/test").param("name","jisu")).andExpect(status().isOk()).andDo(print());
parameter가 여러 개 일 때
: .params(MultiValueMap<String, String> data)MultiValueMap<String, String> data = new LinkedMultiValueMap<>(); data.add("name", "jisu"); data.add("age", "25"); data.add("address", "Incheon"); data.add("githubId", "geesuee"); mock.perform(get("/test").params(data)).andExpect(status().isOk()).andDo(print());
@RequestParam
:MultiValueMap<String, String> data = new LinkedMultiValueMap<>(); data.add("name", "jisu"); data.add("age", "25"); data.add("address", "Incheon"); data.add("githubId", "geesuee"); mock.perform(post("/test").params(data)).andExpect(status().isOk()).andDo(print());
@RequestBody
:mock.perform(post("/test") .content("{\"name\":\"jisu\", \"age\":\"25\", \"address\":\"Incheon\", \"githubId\":\"geesuee\"}") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(print());
andExpect()
메서드에 parameter로 ResultMatcher를 지정하여, 실행 결과의 상태를 검증한다.
출처: KTKO 개발 블로그와 여행 일기
andDo()
메서드에 parameter로 ResultHandler를 지정하여, 실행 결과값을 출력한다.
출처: KTKO 개발 블로그와 여행 일기