@WebMvcTest

2023. 5. 1. 23:51Spring

◎ WebMvcTest

-> Spring MVC 테스트에만 집중하기 위한 애너테이션

-> 컨트롤러 테스트를 하기 위해 사용된다.

-> 해당 애너테이션을 사용하면 MVC 테스트와 관련된 것( @Controller, @ControllerAdvice, @JsonComponent, Converter/GenericConverter, Filter, WebMvcConfigurer, HandlerMethodArgumentResolver)들만 스캔하도록 하여 테스트 대상에만 집중하여 테스트할 수 있다.

@WebMvcTest(MemberController.class)

-> 위 코드는 Controller를 테스트하기 위해 @WebMvcTest를 이용한 것이다.

 

@SpringBootTest VS @WebMvcTest

-> @SpringBootTest는 @AutoConfigureMockMvc와 사용되어 Controller를 테스트 하는데, 이 때 프로젝트에서 사용하는 전체 bean을 Application Context에 등록하여 사용한다. 테스트를 할 때 전체 빈을 다 가져와서 등록하여 테스트하기 때문에 실행 속도가 상대적으로 느리다.

-> @WebMvcTest는 Controller 테스트에 필요한 bean만 가져와서 Application Context에 등록하기 때문에 @SpringBootTest에 비해 상대적으로 실행 속도가 빠르다. 하지만 Controller에서 의존하고 있는 객체가 있다면 Mock 객체로 직접 의존성을 제거해야 한다.

WebMvcTest(MemberController.class)
@MockBean(JpaMetamodelMappingContext.class) // JPA에서 사용하는 빈들을 Mock 객체로 주입하는 설정
@AutoConfigureRestDocs // Spring Rest Docs에 대한 자동 구성을 위한 애너테이션

public class MemberControllerRestDocsTest {
    @Autowired
    private MockMvc mockMvc;

    @MockBean
    // 5 테스트 대상 controller 클래스가 의존하는 객체를 Mock 빈 객체로 주입받기
    private MemberMapper mapper;

-> 위 코드는 테스트 대상인 MemberController가 의존하는 MemberMapper객체를 Mock객체로 직접 선언하여 의존성을 제거하는 코드다.

 

-> @SpringBootTest는 db까지 요청 프로세스가 이어지는 통합 테스트에서 주로 사용하고, @WebMvcTest는 테스트 대상에만 집중하여 테스트하는 슬라이스 테스트에서 주로 사용한다. 

 

★ 참고

@WebMvTest