MVC 프로젝트를 테스트할 때, 컨트롤러 테스트를 쉽게 하기 위해 요청을 수행하고 응답을 만들어내는 Mock 객체를 사용한다. Spring Boot에서는 MockMvc라는 클래스의 객체를 만들어 사용하는데, 이 MockMvc 객체를 생성하는 방법에 대해 정리하려 한다.
<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의 경우 위 두가지 디펜던시가 필요하다.
@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {
@Autowired
private MockMvc mockMvc;
}
@SpringBootTest
는 통합 테스트를 위한 어노테이션이다. 다만, 해당 어노테이션은 MockMvc를 빈으로 등록시키지 않기 때문에, @AutoConfigureMockMvc
어노테이션을 붙여주어야 한다. 위처럼 MockMvc를 등록시켜주면, MockMvc가 제공하는 여러 함수들을 통해 마치 실제로 Controller 객체를 사용하는 것처럼 사용할 수 있다.
@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)로 만들어줄 필요가 있다.
어노테이션을 통한 자동 주입 이외에도, Spring에서 사용하는 것처럼 MockMvc를 직접 생성할 수 있다. 그럴 경우, 반복되는 코드를 설정하는 등의 커스터마이징이 가능하다.
@BeforeEach
public void setup(){
mockMvc = MockMvcBuilders.standaloneSetup(MyController.class)
.alwaysExpect(MockMvcResultMatchers.status().isOk())
.build();
}
@SpringBootTest와 @WebMvcTest, @MockBean 그리고 WebClinet까지
스프링 부트에서 컨트롤러 테스트하기