오늘 할 일

  • 리뷰 스크랩
  • 장바구니 미션 피드백 반영
  • 스프링 테스트 뿌시기
    • @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 과 함께 모의 구현으로 테스트를 작성한다.
@WebMvcTestMockMvc 를 auto-configure 한다. MockMvc 는 full HTTP Server 없이 강력하고 빠르게 MVC controllers를 테스트할 수 있게 도와준다.

💡 TIP
MockMvc는 @WebMvcTest 가 아니더라도 (@SpringBootTest 와 같은) @AutoConfigureMockMvc 애너테이션을 붙이면 사용할 수 있다.

만약 Spring Security를 사용한다면 @WebMvcTestWebSecurityConfigurer 빈도 스캔한다. 테스트를 위해 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의 주요 역할은 다음과 같다

  1. 테스트 클래스에 있는 Spring ApplicationContext를 관리한다. 이를 통해 테스트 환경에서도 Spring 컨테이너를 사용할 수 있게 된다.
  2. 테스트 인스턴스에 대한 Dependency Injection을 제공한다. 이를 통해 @Autowired, @Qualifier, @Inject 등의 어노테이션을 사용해 의존성 주입이 가능해진다.
  3. 테스트 수행 전/후에 필요한 콜백 기능을 제공한다. 예를 들어 @BeforeAll, @BeforeEach, @AfterEach, @AfterAll 등의 어노테이션을 사용하여 초기화, 정리 작업 등을 수행할 수 있다.
  4. 테스트에서 트랜잭션 관리를 지원한다. @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

+ Recent posts