[Spring Boot] MockMvc 객체 DI 및 생성

DongHwan·2021년 7월 11일
2

Spring & Spring Boot

목록 보기
3/5

MVC 프로젝트를 테스트할 때, 컨트롤러 테스트를 쉽게 하기 위해 요청을 수행하고 응답을 만들어내는 Mock 객체를 사용한다. Spring Boot에서는 MockMvc라는 클래스의 객체를 만들어 사용하는데, 이 MockMvc 객체를 생성하는 방법에 대해 정리하려 한다.

Dependency

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Spring Boot의 경우 위 두가지 디펜던시가 필요하다.

1. @SpringBootTest

@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {
    @Autowired
    private MockMvc mockMvc;
}

@SpringBootTest는 통합 테스트를 위한 어노테이션이다. 다만, 해당 어노테이션은 MockMvc를 빈으로 등록시키지 않기 때문에, @AutoConfigureMockMvc 어노테이션을 붙여주어야 한다. 위처럼 MockMvc를 등록시켜주면, MockMvc가 제공하는 여러 함수들을 통해 마치 실제로 Controller 객체를 사용하는 것처럼 사용할 수 있다.

2. @WebMvcTest

@WebMvcTest(controllers = MyController.class)
public class MyControllerTest {
    @Autowired
    private MockMvc mockMvc;
}

위에서 설명한 @SpringBootTest는 통합 테스트이다. 즉, 기본적으로 스프링이 관리하는 모든 빈을 등록시켜서 테스트하기 때문에 무겁다. 그러나 @WebMvcTest@Controller, @ControllerAdvice 등과 같은 Web 레어어와 관련된 특정 빈들만 등록하기에 비교적 가볍다. 또한, 옵션을 통해 테스트할 특정 컨트롤러 클래스를 명시하면 된다.

@WebMvcTest(controllers = MyController.class)
public class MyControllerTest {
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private MyService myService;
}

그리고 Web 관련 레이어들만 등록하기 때문에, Service 빈은 등록되지 않는다. 즉, 가짜(@MockBean)로 만들어줄 필요가 있다.

3. 직접 생성

어노테이션을 통한 자동 주입 이외에도, Spring에서 사용하는 것처럼 MockMvc를 직접 생성할 수 있다. 그럴 경우, 반복되는 코드를 설정하는 등의 커스터마이징이 가능하다.

@BeforeEach
public void setup(){
	mockMvc = MockMvcBuilders.standaloneSetup(MyController.class)
    			.alwaysExpect(MockMvcResultMatchers.status().isOk())
                .build();
}

참고 링크

@SpringBootTest와 @WebMvcTest, @MockBean 그리고 WebClinet까지
스프링 부트에서 컨트롤러 테스트하기

profile
날 어떻게 한줄로 소개해~

0개의 댓글