DEV-STUDY/Spring

[JUnit] MockMVC로 Controller 테스트하기

HwangJerry 2023. 7. 26. 16:50

테스트 코드의 중요성만 익히 듣고 살면서, 제대로 작성해본 적 없기에 이번에 진행하는 프로젝트에서는 테스트 커버리지를 내가 작업하는 도메인에서는 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());
    }

 

 

참고:

 

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션 - 정리 1

한달정도 Spring으로 게시판을 5번정도 시큐리티까지 적용해서 만들어보면서 다른 부분은 이해 했는데 test 부분을 제대로 적용해서 만들지 못한거 같아서 관련 강의를 찾아보았다!책으로 볼까도

velog.io