본문 바로가기
스프링 부트3

MockMVC로 스프링 부트 3 컨트롤러 테스트

by 굿센스굿 2024. 12. 5.
반응형

 

스프링 부트 3에서는 애플리케이션의 컨트롤러를 테스트하기 위해 다양한 도구와 기법을 제공합니다. 그 중에서도 MockMVC는 가장 널리 사용되는 도구 중 하나로, 컨트롤러 레이어를 효과적으로 테스트할 수 있습니다. 이 블로그 포스트에서는 MockMVC를 사용하여 스프링 부트 3 컨트롤러를 테스트하는 방법을 상세히 설명하고, 세 가지 예시를 통해 실습해보겠습니다.

MockMVC란?

MockMVC는 스프링 MVC 애플리케이션을 테스트하기 위한 강력한 도구로, 실제 서블릿 컨테이너 없이도 스프링 MVC를 통한 웹 애플리케이션의 요청 및 응답을 테스트할 수 있습니다. 이를 통해 컨트롤러의 로직을 독립적으로 검증하고, 빠르고 효율적인 테스트를 수행할 수 있습니다.

MockMVC 설정

먼저, MockMVC를 사용하기 위해 필요한 의존성을 build.gradle 파일에 추가해야 합니다.

dependencies {
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

이제 MockMVC를 설정하고, 컨트롤러를 테스트하는 방법을 살펴보겠습니다.

기본 설정 및 테스트 예제

먼저, 테스트하려는 간단한 컨트롤러를 하나 만들어보겠습니다.

@RestController
@RequestMapping("/api")
public class SampleController {

    @GetMapping("/hello")
    public ResponseEntity<String> hello() {
        return ResponseEntity.ok("Hello, World!");
    }
}

이제 이 컨트롤러를 테스트하는 코드를 작성해보겠습니다.

@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldReturnDefaultMessage() throws Exception {
        mockMvc.perform(get("/api/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello, World!"));
    }
}

위의 코드에서는 @SpringBootTest와 @AutoConfigureMockMvc를 사용하여 테스트 환경을 설정하고, MockMvc 객체를 주입받아 /api/hello 엔드포인트에 GET 요청을 보냅니다. 응답 상태 코드와 내용을 검증하여 컨트롤러의 동작을 확인합니다.

예제 1: 경로 변수 테스트

다음으로, 경로 변수를 사용하는 컨트롤러 메서드를 테스트해보겠습니다.

@RestController
@RequestMapping("/api")
public class SampleController {

    @GetMapping("/greet/{name}")
    public ResponseEntity<String> greet(@PathVariable String name) {
        return ResponseEntity.ok("Hello, " + name + "!");
    }
}

이 컨트롤러 메서드를 테스트하는 코드는 다음과 같습니다.

@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldGreetWithName() throws Exception {
        mockMvc.perform(get("/api/greet/John"))
                .andExpect(status().isOk())
                .andExpect(content().string("Hello, John!"));
    }
}

여기서는 경로 변수 name을 포함한 요청을 보내고, 응답 메시지가 올바른지 확인합니다.

예제 2: 요청 본문 테스트

이번에는 POST 요청과 요청 본문을 처리하는 컨트롤러 메서드를 테스트해보겠습니다.

@RestController
@RequestMapping("/api")
public class SampleController {

    @PostMapping("/echo")
    public ResponseEntity<String> echo(@RequestBody String message) {
        return ResponseEntity.ok(message);
    }
}

이 컨트롤러 메서드를 테스트하는 코드는 다음과 같습니다.

@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldEchoMessage() throws Exception {
        String message = "Hello, Spring!";

        mockMvc.perform(post("/api/echo")
                .contentType(MediaType.APPLICATION_JSON)
                .content(message))
                .andExpect(status().isOk())
                .andExpect(content().string(message));
    }
}

여기서는 POST 요청을 통해 본문에 메시지를 전달하고, 컨트롤러가 동일한 메시지를 반환하는지 검증합니다.

예제 3: 예외 처리 테스트

마지막으로, 컨트롤러에서 예외를 처리하는 상황을 테스트해보겠습니다.

@RestController
@RequestMapping("/api")
public class SampleController {

    @GetMapping("/error")
    public ResponseEntity<String> error() {
        throw new RuntimeException("Test exception");
    }

    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleException(RuntimeException ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ex.getMessage());
    }
}

이 컨트롤러 메서드를 테스트하는 코드는 다음과 같습니다.

@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldHandleException() throws Exception {
        mockMvc.perform(get("/api/error"))
                .andExpect(status().isInternalServerError())
                .andExpect(content().string("Test exception"));
    }
}

여기서는 /api/error 엔드포인트에 GET 요청을 보내고, 예외가 발생했을 때 올바르게 처리되는지 확인합니다.

결론

MockMVC는 스프링 부트 3에서 컨트롤러를 테스트하기 위한 강력한 도구입니다. 이 블로그 포스트에서는 기본 설정부터 경로 변수, 요청 본문, 예외 처리까지 다양한 테스트 예제를 살펴보았습니다. 이러한 방법들을 활용하여 여러분의 스프링 부트 애플리케이션의 컨트롤러를 더욱 견고하게 테스트할 수 있습니다.

반응형