스프링 부트 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에서 컨트롤러를 테스트하기 위한 강력한 도구입니다. 이 블로그 포스트에서는 기본 설정부터 경로 변수, 요청 본문, 예외 처리까지 다양한 테스트 예제를 살펴보았습니다. 이러한 방법들을 활용하여 여러분의 스프링 부트 애플리케이션의 컨트롤러를 더욱 견고하게 테스트할 수 있습니다.
'스프링 부트3' 카테고리의 다른 글
Kubernetes 환경에서 스프링 부트 3 운영 (0) | 2024.12.05 |
---|---|
스프링 부트 3에서 Docker로 배포하기 (0) | 2024.12.05 |
WebSocket을 사용한 실시간 통신 (0) | 2024.12.05 |
Spring Data JPA를 사용한 기본 데이터 쿼리 (0) | 2024.12.05 |
스프링 부트 3와 JSON 데이터 처리 (0) | 2024.12.05 |