Test code - MockMvc란?
💟 MockMvc란?
MockMvc는 Spring MVC의 웹 계층을 테스트하기 위해 사용되는 도구로, 웹의 컨트롤러를 실제 서버를 시작하지 않고도 테스트할 수 있게 해 준다. 이를 통해 웹 계층의 독립적인 테스트를 할 수 있다.
MockMvc를 사용하면 spring mvc의 동작을 Mocking하여 http 응답과 요청을 시뮬레이션할 수 있다.
💟 Mocking이란?
모킹은 소프트웨어 테스트에서 특정 객체나 동작을 가짜로 만들어 실제 객체나 동작을 대체하는 기술이다.
이를 통해 독립적이고 격리된 테스트 환경을 구축할 수 있다.
@SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성
@AutoConfigureMockMvc // MockMvc 생성 및 자동 구성
class TestControllerTest {
@DisplayName("getAllMembers: 아티클 조회에 성공한다.")
@Test
public void testGet() throws Exception {
// given
final String url = "/test";
Member savedMember = memberRepository.save(new Member(1L, "홍길동"));
// when
final ResultActions result = mockMvc.perform(get(url)
.accept(MediaType.APPLICATION_JSON));
// then
result
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id").value(savedMember.getId()))
.andExpect(jsonPath("$[0].name").value(savedMember.getName()));
}
💟 @SpringBootTest란?
@SpringBootTest는 Spring Boot 애플리케이션의 전체 컨텍스트를 로드하여 통합 테스트를 수행하는 애노테이션입니다. 이를 통해 실제 애플리케이션 환경과 유사한 조건에서 테스트를 실행할 수 있으며, 스프링 콘텍스트가 제대로 설정되고 작동하는지 검증할 수 있습니다.
💟 @AutoconfigureMockMvc란?
@AutoConfigureMockMvc는 Spring Boot에서 제공하는 테스트 애노테이션으로, MockMvc를 자동으로 구성해줍니다. 이를 통해 개발자는 별도의 설정 없이 MockMvc 인스턴스를 주입받아 테스트를 진행할 수 있습니다. 이 애노테이션은 주로 @SpringBootTest와 함께 사용되어 통합 테스트를 위한 편리한 설정을 제공합니다.
💟 testGet()에서 mock의 기능 확인하기 - GET
MockMvc 객체 생성: 코드의 시작 부분에서는 MockMvc 객체를 생성합니다. MockMvc는 Spring MVC 애플리케이션을 테스트할 때 사용되는 객체로, 가짜로 HTTP 요청을 만들고, 컨트롤러의 응답을 검증할 수 있습니다. |
MockMvc를 사용하여 GET 요청 생성: mockMvc.perform(get(url)...) 부분에서는 MockMvc를 사용하여 특정 URL에 대한 GET 요청을 생성합니다. get(url) 메서드는 해당 URL에 대한 GET 요청을 생성하고, 이 요청을 수행할 MockHttpServletRequestBuilder 객체를 반환합니다. |
Accept 헤더 설정: accept(MediaType.APPLICATION_JSON) 부분은 생성된 GET 요청에 대한 Accept 헤더를 설정합니다. 이렇게 함으로써 테스트 코드가 JSON 형식의 응답을 기대하고 있음을 나타냅니다. |
테스트 실행 및 결과 반환: mockMvc.perform(...) 메서드는 설정된 요청을 실행하고, 결과를 반환합니다. 이 결과는 ResultActions 객체로써, 나중에 테스트에서 실제 응답을 검증할 수 있습니다. |
public void postTest() throws Exception{
// given
final String url = "/quiz";
// when
final ResultActions result = mockMvc.perform(post(url)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(new Code(13))));
// then
result
.andExpect(status().isOk())
.andExpect(content().string("OK!"));
}
💟 postTest() 에서 mock의 기능 확인하기 - POST
mockMvc.perform(post(url) : MockMvc 객체를 사용하여 POST 요청을 생성합니다. post(url) 메서드는 지정된 URL에 대한 POST 요청을 생성하고, 이를 수행할 MockHttpServletRequestBuilder 객체를 반환합니다. |
contentType(MediaType.APPLICATION_JSON) : 생성된 POST 요청에 대해 컨텐츠 타입을 설정합니다. 여기서는 JSON 형식의 컨텐츠를 사용하고 있습니다. |
.content() : 요청 본문에 들어갈 데이터를 설정합니다. |
objectMapper.writeValueAsString(new Code(13)) : 부분은 Java 객체를 JSON 문자열로 변환하여 요청 본문에 설정합니다. 이렇게 설정된 JSON 문자열은 POST 요청의 본문으로 전송됩니다. |
💟 간단정리
기존에는 실제 코드를 실행하여 URL에 직접 값을 입력하고 기능을 확인했었다.
하지만 MockMvc를 사용하면 코드 실행 없이도 HTTP 요청을 테스트할 수 있고, 이를 통해 더욱 효율적으로 코드를 검증하고, 개발 및 디버깅 시간을 단축할 수 있다.
💟 느낀점
이번에 새로운 개념인 MockMvc를 공부하면서, 이렇게 유용하게 테스트할 수 있는 방법을 이제야 알게 되었다는 것이 좀 아쉬웠다.
이전에는 주로 기능을 구현하는 데 집중하여 테스트 코드를 작성하지 않았었는데, 이제는 기본적인 기능들을 구현할 수 있게 되었으니 테스트 코드도 꼼꼼하게 작성해 나가는 연습이 필요하다고 느꼈다.
이제부터는 새로운 기능을 구현할 때마다 테스트 코드를 작성하는 습관을 기르고, 코드의 안정성을 높이도록 노력해 볼 것이다!!
