Notice
Recent Posts
Recent Comments
Link
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());
}
참고:
'workspace > 아티클' 카테고리의 다른 글
[JUnit] 토이 프로젝트 for JUnit practice : Bank App 2 - SecurityConfig (0) | 2023.07.27 |
---|---|
[Junit] 토이 프로젝트 for JUnit practice : Bank App 1 - 환경 설정 (0) | 2023.07.27 |
[이펙티브자바] @Builder를 클래스 레벨이 아닌 생성자 레벨에 사용 (0) | 2023.07.25 |
[고민] 유저가 작성한 게시글 조회는 누구의 관심사인가 (0) | 2023.07.24 |
도커 컴포즈란? (0) | 2023.07.24 |
Comments