MockMvc 직접 설정 vs 어노테이션 사용

Soobin Kim·2024년 11월 21일

Spring

목록 보기
1/2

MockMvc를 직접 설정하는 경우와 그 문제점

직접 설정하는 경우, MockMvc 객체를 수동으로 생성하고, 컨트롤러를 수동으로 주입하거나, 의존성들을 수동으로 모킹해야 한다. 이를 통해 테스트 환경을 구성하는 데 많은 코드가 필요하고, 번거로운 설정 작업이 동반된다.

1. 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 객체를 테스트 컨텍스트에 자동으로 등록하고 필요한 모든 의존성을 자동으로 관리하므로, 테스트 코드는 컨트롤러의 동작에만 집중할 수 있다.

2. @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에 의해 관리)
테스트 준비 시간더 많은 설정 코드 필요설정 없이 바로 테스트 가능
유지보수성코드가 복잡하고 추가 의존성마다 수정 필요테스트 로직만 작성하면 된다

왜 편리한가?

  1. 시간 절약: 수동으로 객체를 생성하거나 의존성을 모킹할 필요가 없다.
  2. 통합적인 테스트 환경: Spring의 다양한 컴포넌트(Support 클래스, 필터 등)가 실제 환경과 동일하게 작동하므로 테스트의 신뢰성이 높아진다.
  3. 유지보수성 향상: 코드가 간결하고, 의존성 변화에도 추가 설정이 필요 없으므로 유지보수하기 쉽다.

따라서, @AutoConfigureMockMvc를 사용하면 테스트의 설정 부담을 줄이고, 애플리케이션의 실제 동작에 가깝게 테스트를 수행할 수 있어 효율적이다.

0개의 댓글