@SpringBootTest VS @WebMvcTest

송현진·2023년 7월 25일

Spring

목록 보기
10/10
post-thumbnail

@SpringBootTest

프로젝트 내부에 있는 Bean을 모두 등록하며, 실제 운영 환경에서 사용되는 클래스들을 통합해서 테스트를 진행한다.
따라서 실제 환경과 유사하게 테스트가 가능하다는 장점이 있지만, 모든 Bean을 등록하기 때문에 느리고 테스트 단위가 커서 디버깅이 까다롭다는 단점이 있다.

@WebMvcTest

Controller의 역할만을 테스트하며 Web Layer에 해당하는 Bean만 빠르게 생성한다.
@Component를 등록하지 않기 때문에 필요한 Bean을 직접 채워야하지만 테스트가 훨씬 빠르다는 장점이 있다.
통합테스트에서 진행이 어려운 경우 Mock으로 테스트 가능하나 MockMvc를 사용하므로 실제 동작과 차이가 있다.

✏️ Mock

실제 객체를 만들어서 테스트하기가 어려운 경우, 가짜 객체를 만들어서 테스트하는 기술

✏️ MockMvc

MVC에 관련된 Mock 가짜 객체
웹 어플리케이션을 애플리케이션 서버에 배포하지 않고, 테스트용 MVC 환경을 만들어서 요청 및 전송, 응답 기능을 제공해주는 객체.
대부분 기능 테스트 위해 MockMvc 객체를 만들어서 테스트 하는데 MockMvc@Autowired로 주입받아서 사용가능

(1) Mock 주입 시 차이

@SpringBootTest

@SpringBootTest
class Test{
	@Autowired
    MockMvc mockMvc; // 주입 X
}
------------------------------
@SpringBootTest
@AutoConfigureMockMvc
class Test{
	@Autowired
    MockMvc mockMvc; // 주입 O
}

주입되지 않아 오류가 발생한다.
그 이유는, @SpringBootTestMockMvcBean으로 등록시키지 않기 때문이다.
그래서 @AutoConfigureMockMvc 어노테이션으로 선언하면 MockMvcBean으로 등록해준다.

@WebMvcTest

@WebMvcTest
class Test{
	@Autowired
    MockMvc mockMvc; // 주입 O
}

@WebMvcTestMockMvc를 빈으로 등록해서 선언하면 객체가 주입된다.

(2) Bean 등록 범위 차이

@SpringBootTest

@SpringBootTest
class Test{
	@Autowired
    MockMvc mockMvc; // 주입 O
    @Autowired
    TestController testController; // 주입 O
    @Autowired
    TestService testService; // 주입 O
    @Autowired
    TestRepository testRepository; // 주입 O
}

프로젝트의 Controller, Service, Repository@Autowired로 다 주입된다.

@WebMvcTest

@WebMvcTest
class Test{
	@Autowired
    MockMvc mockMvc; // 주입 O
    @Autowired
    TestController testController; // 주입 O
    
    @Autowired
    TestService testService; // 주입 X
    @Autowired
    TestRepository testRepository; // 주입 X
    ----------------------------------------
    @MockBean
    TestService testService; // 주입 O
    @MockBean
    TestRepository testRepository; // 주입 O
}

Web Layer 관련 Bean들만 등록하기 때문에 Controller는 정상적으로 주입되지만,
@Component로 등록된 ServiceRepository는 주입되지 않는다.
따라서, 정상적으로 사용하기 위해서 @MockBean을 사용해 ServiceRepositoryMock 객체에 Bean으로 등록해줘야한다.

✏️ 간단하게 사용하려면 @Mock 을 사용하면 되고, 컨테이너에 올리고 싶으면 @MockBean을 사용하면 된다.

✏️ Web Layer 항목들
Security, Filter, Interceptor, request/response Handling, Controller

참고
@SpringBootTest 와 @WebMvcTest의 차이점 자료

profile
개발자가 되고 싶은 취준생

0개의 댓글