@SpringBootTest는 Spring Boot에서 제공하는 애노테이션으로, 통합 테스트를 위해 사용됩니다. 이는 애플리케이션 컨텍스트를 실제 애플리케이션과 동일하게 부트스트랩하여 모든 빈, 설정 및 애스펙트를 포함한 전체 애플리케이션 컨텍스트를 테스트할 수 있게 해줍니다.
다음은 @SpringBootTest에 대한 주요 사항입니다:
- 애노테이션 사용법: 테스트 클래스에 @SpringBootTest를 추가하면 Spring Boot는 메인 설정 클래스(@SpringBootApplication이 붙은 클래스)를 찾아서 Spring 애플리케이션 컨텍스트를 시작합니다.
- 설정:
- 기본적으로 @SpringBootTest는 전체 애플리케이션 컨텍스트를 시작합니다.
- 특정 클래스나 설정을 지정하여 테스트 시 필요한 부분만 로드할 수 있습니다. 이를 통해 테스트 속도를 향상시킬 수 있습니다.
- 웹 환경:
- @SpringBootTest는 웹 환경을 시작하도록 설정할 수 있습니다. 이는 웹 애플리케이션 테스트에 유용합니다.
- webEnvironment 속성을 다음 값으로 설정할 수 있습니다:
- WebEnvironment.MOCK: 모의 서블릿 환경을 로드합니다 (기본값).
- WebEnvironment.RANDOM_PORT: 실질적인 서블릿 환경을 무작위 포트로 로드합니다.
- WebEnvironment.DEFINED_PORT: 정의된 포트로 실질적인 서블릿 환경을 로드합니다.
- WebEnvironment.NONE: 웹 환경 없이 애플리케이션 컨텍스트를 로드합니다.
- 예제:
- 장점:
- 포괄적인 테스트: 전체 Spring Boot 애플리케이션 컨텍스트를 테스트할 수 있습니다.
- 현실적인 환경: 실제 애플리케이션이 실행될 환경과 유사한 시나리오를 시뮬레이션할 수 있습니다.
- 단점:
- 성능: 전체 컨텍스트를 시작하기 때문에 단위 테스트에 비해 속도가 느릴 수 있습니다.
- 복잡성: 단순한 단위 테스트에 비해 설정 및 관리가 복잡할 수 있습니다.
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.web.client.TestRestTemplate;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyApplicationTests {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void contextLoads() {
// 여기서 통합 테스트 수행
String body = this.restTemplate.getForObject("/", String.class);
assertThat(body).isEqualTo("Hello, World!");
}
}
@SpringBootTest는 애플리케이션의 실제 사용 시나리오와 유사한 통합 테스트를 작성할 수 있게 해주는 강력한 도구입니다.
@WebMvcTest는 Spring Boot에서 제공하는 애노테이션으로, 웹 계층(Web Layer) 테스트를 위한 것입니다. 주로 Spring MVC 컨트롤러를 테스트하는 데 사용되며, 전체 애플리케이션 컨텍스트를 로드하지 않고 웹 관련 빈만 로드하기 때문에 테스트 속도가 빠르고 집중적입니다.
다음은 @WebMvcTest에 대한 주요 사항입니다:
- 애노테이션 사용법: @WebMvcTest는 주로 특정 컨트롤러 클래스를 테스트할 때 사용됩니다. 애노테이션에 테스트할 컨트롤러 클래스를 지정합니다.
- 예제:
-
java
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(MyController.class) public class MyControllerTest { @Autowired private MockMvc mockMvc; @MockBean private MyService myService; @Test public void shouldReturnDefaultMessage() throws Exception { mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(content().string("Hello, World!")); } } - 주요 기능:
- MockMvc: MockMvc 빈을 자동으로 구성하여 HTTP 요청을 모의하고 응답을 검증할 수 있습니다.
- 특정 컨트롤러 테스트: 애노테이션에 특정 컨트롤러 클래스를 지정하면 해당 컨트롤러와 관련된 빈만 로드하여 테스트를 수행합니다.
- 간편한 서비스 모킹: @MockBean을 사용하여 서비스 계층을 모킹(Mocking)할 수 있습니다. 이를 통해 서비스 로직을 실제로 호출하지 않고도 컨트롤러 로직을 테스트할 수 있습니다.
- 장점:
- 빠른 테스트: 전체 애플리케이션 컨텍스트를 로드하지 않기 때문에 테스트 속도가 빠릅니다.
- 집중적인 테스트: 특정 컨트롤러 및 웹 관련 로직에 집중하여 테스트를 수행할 수 있습니다.
- 단점:
- 제한된 컨텍스트: 웹 계층만 테스트하기 때문에 서비스 계층이나 리포지토리 계층을 포함한 통합 테스트에는 적합하지 않습니다.
@WebMvcTest는 컨트롤러 로직을 빠르고 집중적으로 테스트하는 데 유용하며, 주로 단위 테스트와 통합 테스트 사이의 영역을 커버하는 역할을 합니다. 이를 통해 HTTP 요청 및 응답의 검증, 컨트롤러의 작동 여부 등을 효과적으로 확인할 수 있습니다.