MockMvc를 직접 설정하는 경우와 그 문제점직접 설정하는 경우, MockMvc 객체를 수동으로 생성하고, 컨트롤러를 수동으로 주입하거나, 의존성들을 수동으로 모킹해야 한다. 이를 통해 테스트 환경을 구성하는 데 많은 코드가 필요하고, 번거로운 설정 작업이 동반된다.
MockMvc 수동 설정 예시import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
public class ManualMockMvcTest {
private MockMvc mockMvc;
@Mock
private ExampleService exampleService;
@InjectMocks
private ExampleController exampleController;
@BeforeEach
void setup() {
MockitoAnnotations.openMocks(this); // Mock 객체 초기화
mockMvc = MockMvcBuilders.standaloneSetup(exampleController).build(); // MockMvc 수동 생성
}
@Test
void testExampleEndpoint() throws Exception {
mockMvc.perform(get("/example"))
.andExpect(status().isOk())
.andExpect(content().string("Hello World"));
}
}
문제점:
1. MockMvc 객체를 매번 수동으로 초기화해야 한다.
2. ExampleService와 같은 의존성을 직접 모킹하고 주입해야 한다.
3. 컨트롤러 외의 Spring MVC 기능(예: 필터, 인터셉터, 컨트롤러 어드바이스 등)은 제대로 테스트되지 않는다.
4. 의존성이 많아질수록 테스트 설정 코드가 복잡해진다.
@AutoConfigureMockMvc를 사용하는 경우Spring Boot에서 @AutoConfigureMockMvc를 사용하면 이러한 설정을 자동화해준다. MockMvc 객체를 테스트 컨텍스트에 자동으로 등록하고 필요한 모든 의존성을 자동으로 관리하므로, 테스트 코드는 컨트롤러의 동작에만 집중할 수 있다.
@AutoConfigureMockMvc 사용 예시import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
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.*;
@SpringBootTest
@AutoConfigureMockMvc
public class AutoConfiguredMockMvcTest {
@Autowired
private MockMvc mockMvc;
@Test
void testExampleEndpoint() throws Exception {
mockMvc.perform(get("/example"))
.andExpect(status().isOk())
.andExpect(content().string("Hello World"));
}
}
편리한 점:
1. MockMvc 객체를 자동으로 생성하고 주입할 수 있다.
2. 컨트롤러 및 서비스, 리포지토리 등 모든 의존성을 자동으로 관리한다.
3. Spring MVC 환경을 완전하게 지원한다. (필터, 인터셉터, 컨트롤러 어드바이스 등이 실제 환경과 동일하게 동작)
4. 설정 코드 없이 테스트 로직에만 집중할 수 있다.
| 특징 | 직접 설정 | @AutoConfigureMockMvc |
|---|---|---|
| MockMvc 생성 | MockMvcBuilders를 사용해 수동 생성 | 자동 생성 및 주입 (@Autowired) |
| Spring MVC 지원 | 제한적 (필터, 인터셉터 등이 테스트되지 않음) | 필터, 인터셉터, 어드바이스 모두 포함 |
| 의존성 관리 | 의존성을 수동 모킹 및 주입 | 자동 관리 (Spring Context에 의해 관리) |
| 테스트 준비 시간 | 더 많은 설정 코드 필요 | 설정 없이 바로 테스트 가능 |
| 유지보수성 | 코드가 복잡하고 추가 의존성마다 수정 필요 | 테스트 로직만 작성하면 된다 |
따라서, @AutoConfigureMockMvc를 사용하면 테스트의 설정 부담을 줄이고, 애플리케이션의 실제 동작에 가깝게 테스트를 수행할 수 있어 효율적이다.