Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 다시보기
- 그래프
- 트러블슈팅
- 자바
- JUnit
- 유니온파인드
- 알고리즘기본개념
- 코테
- 그리디
- database
- 알고리즘
- 부분수열의합2
- DFS
- 백준
- Union Find
- 코딩테스트실력진단
- DP
- 싸피
- 코딩테스트
- 다익스트라
- JPA
- SSAFY
- 기본유형
- 코드트리
- 완탐
- Java
- Spring
- BFS
- SWEA
- 완전탐색
Archives
- Today
- Total
HwangHub
[JUnit] MockMVC로 Controller 테스트하기 본문
테스트 코드의 중요성만 익히 듣고 살면서, 제대로 작성해본 적 없기에 이번에 진행하는 프로젝트에서는 테스트 커버리지를 내가 작업하는 도메인에서는 50% 이상 가져갈 것을 결심하며, test framework에 대한 공부를 시작합니다.
MockMVC란?
어플리케이션 서버를 실행하기 않고 Spring MVC 동작을 모의 테스트해볼 수 있는 모의 객체를 의미합니다. 테스트 코드는 우리가 매번 기능 개발 이후 어플리케이션을 실행하여 휴먼 터치로 테스트하지 않고도 모든 기능들이 정상적으로 여전히 잘 돌아가는지를 빠르게 테스트하기 위해서 작성됩니다. 하지만 Controller의 경우에는 외부의 요청이라는 객체가 필요하기 때문에 무작정 하기가 어려운데, SpringMVC 동작을 가상으로 수행할 수 있도록 MockMVC가 도와줍니다.
@SpringBootTest : 통합 테스트를 수행할 때에는 이 어노테이션을 사용하여야 합니다. 이게 붙은 메서드는 실행되기 위해 모든 Bean을 로드해야 하므로 테스트 구동시간이 좀 걸립니다.
@AutoConfigureMockMvc : mock 테스트 시에 필요한 의존성을 제공하는 어노테이션입니다. mockmvc를 활용한 테스트 수행이 가능하려면 관련 의존성을 추가해줘야 하는데, 편리하게도 이 어노테이션으로 우리는 쉽게 이를 수행할 수 있게 됩니다.
MockMvc를 제대로 사용하기 위한 내장 함수는?
- perform() -> 요청을 전송하는 역할을 담당합니다. 인자는 RequestBuilders 타입의 객체입니다. 구현체는 MockMvcRequestBuilders를 사용합니다. 요청 결과로는 ResultActions 객체를 반환합니다.
- andExpect() -> 응답을 검증합니다. 인자는 ResultMatcher 타입의 객체를 넣어줘야 합니다. 구현체는 MockMvcResultMatchers를 사용합니다.
실습예제
@Autowired
private MockMvc mockMvc;
@Test
public void Home_테스트() throws Exception {
mockMvc.perform(get("/home"))
.andExpect(status().isOk()) // 200
.andDo(print());
}
@Test
public void 존재하지_않는_페이지_테스트 () throws Exception {
mockMvc.perform(get(“fakepage”))
.andExpect(status.isNotFound()) // 404
.andDo(print());
}
@Test
public void Unit1_테스트() throws Exception {
int unit=1;
int question1= 5;
int question2 = 2;
String question3 = “SELECT NAME, POSITION, SALARY FROM EMPLOYEE”;
String body = "{\"unit\":"+unit+", \"question1\": "+question1+", \"question2\": "+question2+", \"question3\": \""+question3+"\"}";
mockMvc.perform(post("/test/grading")
.content(body) // request body를 POST 요청으로 전송
.contentType(MediaType.APPLICATION_JSON)) // json 포맷의 요청임을 명시
.andExpect(status().isOk())
.andExpect(jsonPath("$.questionList[0].isCorrect").value(true))
.andExpect(jsonPath("$.questionList[1].isCorrect").value(true))
.andExpect(jsonPath("$.questionList[2].isCorrect").value(true))
.andDo(print());
}
@Test
public void index_test() throws Exception {
ResultActions resultActions = mockMvc.perform(get("/index"));
resultActions.andExpect(status().isCreated());
}
참고:
'DEV-STUDY > Spring' 카테고리의 다른 글
[JUnit] 토이 프로젝트 for JUnit practice : Bank App 2 - SecurityConfig (0) | 2023.07.27 |
---|---|
[Junit] 토이 프로젝트 for JUnit practice : Bank App 1 - 환경 설정 (0) | 2023.07.27 |
[Spring] entity field에 wrapper class를 사용하는 이유 (0) | 2023.07.20 |
[Spring] profiles 설정 (spring boot 2.4 버전 이후) (0) | 2023.07.20 |
[Gradle] java-library 플러그인, implementation()과 api() 차이 (0) | 2023.07.17 |
Comments