2023. 5. 1. 23:51ㆍSpring
◎ 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는 테스트 대상에만 집중하여 테스트하는 슬라이스 테스트에서 주로 사용한다.
★ 참고
'Spring' 카테고리의 다른 글
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String (0) | 2023.05.16 |
---|---|
Could not autowire. No beans of '~' type found (0) | 2023.05.15 |
@ExtendWith(MockitoExtension.class), @Mock, @InjectMocks, @MockBean (0) | 2023.04.30 |
OAuth2 동작 방식 (0) | 2023.03.28 |
OAuth2 (0) | 2023.03.28 |