본문 바로가기

Spring Boot

[Spring Boot] Spring Boot MockMvc 이해

728x90

 

Spring MockMvc는 Spring MVC 애플리케이션을 테스트하는 데 사용되는 강력한 도구입니다. 이를 통해 실제 서버를 시작하지 않고도 MVC 애플리케이션의 웹 계층을 테스트할 수 있습니다. MockMvc는 주로 Controller의 동작을 검증하는 데 사용되며, 요청을 시뮬레이션하고 응답을 검증할 수 있게 해줍니다.

 

개념과 목적


MockMvc는 Spring의 테스트 모듈 중 하나로, HTTP 요청과 응답을 모킹(mocking)하여 컨트롤러 레이어를 테스트할 수 있도록 합니다. 실제 서블릿 컨테이너를 실행하지 않고도 Spring MVC 애플리케이션의 웹 계층을 테스트할 수 있습니다.

  • 신속한 피드백: 빠르게 테스트를 실행하여 피드백을 받을 수 있습니다.
  • 서버 독립적 테스트: 실제 서버를 시작하지 않고도 테스트할 수 있어 개발 환경에 구애받지 않습니다.
  • 자동화된 테스트: 다양한 요청과 응답을 쉽게 시뮬레이션하여 테스트 자동화를 지원합니다.

 

Controller 내의 흐름

MockMvc를 사용한 테스트는 보통 다음과 같은 흐름으로 진행됩니다.

  1. MockMvc 설정: MockMvc 객체를 초기화합니다.
  2. 요청 전송: MockMvc를 통해 HTTP 요청을 보냅니다.
  3. 응답 검증: 반환된 응답을 검증합니다.
@RunWith(SpringRunner.class)
@WebMvcTest(YourController.class)
public class YourControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testGetEndpoint() throws Exception {
        mockMvc.perform(get("/your-endpoint"))
               .andExpect(status().isOk())
               .andExpect(content().string("Expected response"));
    }
}

 

주요 메서드 예시 및 어노테이션

 

주요 메서드

  • perform(): 요청을 실행합니다.
  • andExpect(): 응답에 대한 기대치를 설정합니다.
  • andDo(): 요청 후 추가 작업을 수행합니다(예: 결과 로깅).

예시

mockMvc.perform(get("/users/1"))
       .andExpect(status().isOk())
       .andExpect(content().contentType(MediaType.APPLICATION_JSON))
       .andExpect(jsonPath("$.name").value("John Doe"));

 

어노테이션

  • @RunWith(SpringRunner.class): 테스트가 Spring의 테스트 컨텍스트 프레임워크에서 실행되도록 설정합니다.
  • @WebMvcTest: 특정 컨트롤러를 테스트하기 위해 사용합니다. 해당 컨트롤러와 관련된 빈만 로드됩니다.
  • @Autowired: 필요한 빈을 주입받기 위해 사용됩니다.

 

자세한 설명

 

MockMvc 설정

MockMvc는 일반적으로 @WebMvcTest와 함께 사용됩니다. @WebMvcTest는 컨트롤러 레이어만 로드하기 때문에 다른 빈들로 인한 영향을 받지 않고 순수하게 컨트롤러 레이어를 테스트할 수 있습니다.

@RunWith(SpringRunner.class)
@WebMvcTest(YourController.class)
public class YourControllerTest {

    @Autowired
    private MockMvc mockMvc;
}

 

요청 전송

perform() 메서드를 사용하여 요청을 전송합니다. 이 메서드는 다양한 HTTP 메서드(GET, POST, PUT, DELETE 등)를 지원합니다.

mockMvc.perform(get("/api/resource"))
       .andExpect(status().isOk());

 

응답 검증

 

andExpect() 메서드를 사용하여 응답의 상태, 헤더, 본문 등을 검증할 수 있습니다. 여러 andExpect() 호출을 연결하여 다양한 검증을 할 수 있습니다.

mockMvc.perform(get("/api/resource"))
       .andExpect(status().isOk())
       .andExpect(content().contentType(MediaType.APPLICATION_JSON))
       .andExpect(jsonPath("$.id").value(1));

MockMvc를 사용하면 Spring MVC 애플리케이션의 컨트롤러 레이어를 효과적으로 테스트할 수 있습니다. 이를 통해 코드의 신뢰성을 높이고, 리팩토링 시 발생할 수 있는 오류를 미연에 방지할 수 있습니다.