오늘 할 일
- 리뷰 스크랩
장바구니 미션 피드백 반영- 스프링 테스트 뿌시기
@WebMvcTest- @
ExtendWith @ContextConfiguration@MockBean- @Inject Mocks
- @SpringBootTest
- @JdbcTest
@WebMvcTest
Spring MVC controller가 예상한 대로 동작하는 것을 테스트할 때 사용한다. Spring MVC의 infrastructure를 auto-configure 하고, 빈의 스캔을 @Controller
, @ControllerAdvice
, @JsonComponent
, Converter
, GenericConverter
, Filter
, HandlerInterceptor
, WebMvcConfigurer
, WebMvcRegistrations
, and HandlerMethodArgumentResolver
로 제한한다.@Component
나 @ConfigurationProperties
은 스캔되지 않는다. @ConfigurationProperties
빈을 포함시키기 위해 @EnableConfigurationProperties
를 사용할 수 있다.
💡 TIP
Jackson 모듈과 같은 컴포넌트를 추가로 등록하기 위해서 @Import를 사용할 수 있다.
@WebMvcTest
는보통 단일 컨트롤러로 제한되며 @MockBean
과 함께 모의 구현으로 테스트를 작성한다.@WebMvcTest
는 MockMvc
를 auto-configure 한다. MockMvc
는 full HTTP Server 없이 강력하고 빠르게 MVC controllers를 테스트할 수 있게 도와준다.
💡 TIP
MockMvc는 @WebMvcTest 가 아니더라도 (@SpringBootTest 와 같은) @AutoConfigureMockMvc 애너테이션을 붙이면 사용할 수 있다.
만약 Spring Security를 사용한다면 @WebMvcTest
는 WebSecurityConfigurer
빈도 스캔한다. 테스트를 위해 security를 비활성화하는 대신에 Spring Security' test support를 사용할 수 있다.
Testing With Spring Security
@ExtendWith
Junit Jupiter API의 확장 기능을 사용하도록 테스트 클래스나 메서드에 적용할 수 있다. 테스트 실행 전후에 추가적인 동작이나 설정을 제공하는 확장 클래스를 적용할 수 있다.
스프링에서는 보통 @ExtendWith(SpringExtension.class)
와 같이 SpringExtension
확장 기능을 사용한다. Spring TestContext Framework를 Junit Jupiter 확장 모델에 통합한다. 이를 통해 Junit5 테스트에서 Spring의 기능들을 사용할 수 있다.
SpringExtension
의 주요 역할은 다음과 같다
- 테스트 클래스에 있는 Spring ApplicationContext를 관리한다. 이를 통해 테스트 환경에서도 Spring 컨테이너를 사용할 수 있게 된다.
- 테스트 인스턴스에 대한 Dependency Injection을 제공한다. 이를 통해
@Autowired
,@Qualifier
,@Inject
등의 어노테이션을 사용해 의존성 주입이 가능해진다. - 테스트 수행 전/후에 필요한 콜백 기능을 제공한다. 예를 들어
@BeforeAll
,@BeforeEach
,@AfterEach
,@AfterAll
등의 어노테이션을 사용하여 초기화, 정리 작업 등을 수행할 수 있다. - 테스트에서 트랜잭션 관리를 지원한다.
@Transactional
어노테이션을 사용해 테스트가 데이터베이스 트랜잭션 내에서 실행되도록 할 수 있다.
@ContextConfiguration
테스트에서 ApplicationContext에 대한 설정 파일을 로드하는 데 사용한다. 테스트에 사용하기 위한 특정 빈을 로드하는 것이라면 @Import를 사용하는 것이 명시적이다.
스프링의 테스트는 ApplicationContext를 생성하는 작업이 오래 걸리기 때문에 설정이 같다면 캐싱을 해서 여러 테스트에서 공유하여 사용한다. 이때 @TestConfiguration으로 등록한 빈들을 @ContextConfiguration으로 로드하여 같은 ApplicationContext를 사용하도록 한다면 테스트의 성능을 향상시킬 수 있다.
@MockBean
Spring Boot는 ApplicationContext
빈으로 Mockito Mock을 정의하여 등록할 수 있는 @MockBean을 포함한다. test classes에서 필드에 선언하여 사용할 수 있고, @Configuration
클래스와 필드에 선언하여 사용할 수도 있다. Mock Beans는 각 테스트 메서드 이후에 자동으로 reset 된다.
✏️ NOTE
CGLib 프록시는 메서드를 final로 선언한다. Mockito는 final로 선언된 메서드를 mock이나 spy할 수 없다. 이러한 빈을 테스트하기 위해서는 inline mock maker를 사용할 수 있다. org.mockito:mockito-inline 를 application의 test dependencies에 추가하면 사용할 수 있다.
💡 TIP
@SpyBean 을 이용하여 스프링에 의해 프록시된 빈을 스파이할 때, 스프링의 프록시를 제거해야 할 때가 있다. AopTestUtils.getTargetObject(yourProxiedSpy) 를 사용하면 가능하다.
'회고 > 우아한테크코스' 카테고리의 다른 글
2023.05.08 일일 회고 (0) | 2023.05.09 |
---|---|
[레벨 2] 웹 자동차 경주 미션 회고 (0) | 2023.05.08 |
2023.05.04 일일 회고 (0) | 2023.05.05 |
2023.05.03 일일 회고 (0) | 2023.05.04 |
2023.05.02 일일 회고 (0) | 2023.05.03 |