본문 바로가기
그룹스터디

@SpringBootTest, @WebMvcTest, @DataJpaTest

by 민초닷컴 2023. 1. 6.

@SpringBootTest

통합 테스트를 위한 환경을 준비해주고, 모든 빈들을 스캔하고 애플리케이션 컨텍스트를 생성하여 테스트를 실행

 

설정할 수 있는 값

  • value와 properties : 애플리케이션 실행에 필요한 프로퍼티를 key = value 형태로 추가
  • args : 애플리케이션의 arguments로 값 전달
  • classes : 애플리케이션 로딩할 때 사용되는 컴포넌트 클래스 정의
  • webEnvironment : 웹 테스트 환경 설정(Enum) </aside>

webEnvironment의 Enum 값

 

MOCK

웹 기반의 애플리케이션 컨텍스트를 생성하지만 MOCK 환경으로 제공하여 내장 서버 시작X

웹 환경이 클래스 패스에 없다면 웹이 아닌 애플리케이션 컨텍스트 생성

웹 기반의 Mock 테스트를 위해 @AutoConfigureMockMvc 또는 @AutoConfigureWebTestClient와 함께 사용

 

RANDOM_PORT

웹 기반의 애플리케이션 컨텍스트를 생성하여 실제 웹 환경 제공

내장 서버도 실행되며 사용하지 않는 랜덤 포트를 listen

 

DEFINED_PORT

웹 기반의 애플리케이션 컨텍스트를 생성하고 실제 웹 환경 제공

내장 서버도 실행되며 지정된 포트(default 8080)를 listen

 

NONE

SpringApplication으로 애플리케이션 컨텍스트 생성

웹 환경 제공 X </aside>

 

@SpringBootTest의 단점

  • 기본적으로 모든 빈을 탐색하고 등록하기 때문에 불필요하게 무거워지고 시간이 오래 걸린다.
  • 특정 계층만 테스트가 불가능

@WebMvcTest

손 쉽게 컨트롤러를 테스트할 수 있는 환경을 준비해주고, 내장된 서블릿 컨테이너가 랜덤 포트로 실행 즉 애플리케이션 컨텍스트를 만들 때 컨트롤러와 연관된 빈들만을 제한적으로 찾아서 등록한다.

 

@WebMvcTest에서 스캔 되는 애너테이션

  • @Controller, @RestController
  • @ControllerAdvice, @RestControllerAdvice
  • @JsonComponent
  • Filter
  • WebMvcConfigurer
  • HandlerMethodArgumentResolver </aside>

추가적인 설정이 필요하면 @Import를 사용 가능하고 @MockBean이나 @SpyBean 역시 사용 가능 또한 @WebMvcTest는 컨트롤러 테스트이므로 @WebMvcTest 내부에 @AutoConfigureMockMvc가 들어있다. 그러므로 @Autowired로 MockMvc를 주입받을 수 있으며, 만약 웹플럭스를 이용중이라면 @WebFluxTest를 사용하면 된다.

@Import(SecurityConfig.class)
@WebMvcTest(ArticleController.class)
class ArticleControllerTest {

}
  • Import를 통해 Security 관련 추가 설정
  • 특정 Controller 지정해서 테스트 가능

@DataJpaTest

JPA 레포지토리 테스트를 위해 사용. 기본적으로 @Entiry가 있는 엔티티 클래스들을 스캔

@Import(JpaConfig.class)
@DataJpaTest
class JpaRepositoryTest {
}
  • @DataJpaTest에는 @Transactional 어노테이션이 들어있어서 기본적으로 모든 테스트가 롤백된다. 만약 롤백을 원하지 않는다면 @Rollback(false)를 추가
  • 내장 데이터베이스가 클래스 패스에 존재한다면 내장 데이터베이스가 자동 구성된다. 만약 자동 구성을 원하지 않는다면 @AutoConfigureTestDatabase의 replace 속성을 NONE으로 설정