스프링부트 테스트
스프링부트2에서는 기본적인 테스트 스타터를 제공한다. 기본적으로 제공되는 테스트 어노테이션은 아래와 같이 제공됩니다.
- @SpringBootTest
- @WebMvcTest
- @DataJpaTest
- @RestClientTest
- @JsonTest
- @DataRedisTest
이 글에서 @SpringBootTest
, @WebMvcTest
, @DataJpaTest
에 관해서 살펴보도록 하겠습니다.
@SpringBootTest
통합 테스트를 제공하는 기본적인 부트 테스트 어노테이션입니다. 여러단위의 테스트들을 하나의 테스트로 수행할 때 적합 합니다.
하지만, 애플리케이션이 실행되는 것과 동일하게 애플리케이션에 설정된 모든 빈들을 로드하기 때문에 애플리케이션 규모가 클수록 느려집니다.
@ActiveProfiles("local")
과 같은 방식으로 프로파일 환경값을 부여할 수 있다.- 테스트에서
@Transactional
을 사용하면 데이터가 롤백됩니다. 하지만, 서버의 다른 스레드에서 실행 중이면 WebEnvironment의RANDOM_PORT
나DEFINDE_PORT
를 사용해서 테스트를 수행해도 트랜잭션이 롤백되지 않습니다. @SpringBootTest
는 기본적으로@SpringBootApplication
이나@SpringBootConfiguration
어노테이션을 찾습니다. 둘 중 하나는 필수이다.
@WebMvcTest
MVC관련 설정인 @Controller
, @ControllerAdvice
, @JsonComponent
, Filter
,WebMvcConfigurer
,HandlerMethodArgumentResolver
만 로드되므로 @SpringBootTest
보다 가볍게 테스트 가능합니다.
특징
- 웹에서 테스트하기 힘든
컨트롤러
를 테스트하는데 적합합니다. - 웹상에서
요청
과응답
에 대해 테스트할 수 있습니다. - 시큐리티 혹은 필터까지 자동으로 테스트하며 수동으로
추가/삭제
까지 가능합니다.
WebMvcTest 예시
1.Book
1 |
|
2.BookController
1 |
|
3.BookService
1 | public interface BookService { |
- Book타입의 리스트를 넘기는 메서드를 작성하고, 실제 구현체는 만들지않고, mock데이터를 이용해 테스트를 진행하겠습니다.
4.BookControllerTest
1 | import org.junit.Test; |
@WebMvcTest
를 사용하기 위해 테스트할 특정 컨트롤러명을 명시해주어야합니다. 주입된MockMvc
는 컨트롤러 테스트 시 모든 의존성을 로드하지않고,BookController
관련된 빈만 로드하여 가볍게 테스트를 수행합니다.@Service
어노테이션은WebMvcTest
의 적용대상이 아닙니다.BookService
인터페이스를 구현한 구현체가 없지만@MockBean
을 적극활용하여 컨트롤러 내부의 의존성 요소인BookService
를 가짜 객체로 대체하였습니다. 이러한 것을목 객체
라고 하고, 실제 객체는 아니지만 특정행위(given()
)를 지정하여 실제 객체처럼 동작하게 할 수 있습니다.
@DataJpaTest
이 어노테이션은 JPA 관련 테스트 설정만 로드합니다. 데이터소스의 설정이 정상적인지, JPA를 사용하여 데이터를 제대로 CRUD하는지 테스트 할 수 있습니다.
특징
- 기본적으로 인메모리 임베디드 데이터베이스를 사용하며,
@Entity
클래스를 스캔하여 JPA저장소를 구성합니다. - JPA테스트가 끝날 때마다 자동으로 데이터를 롤백합니다.
@AutoConfigureTestDatabase
어노테이션의 기본 설정값인 Replace.Any를 사용하면 기본 내장 데이터소스를 사용합니다. Replace.NONE으로 설정하면 프로파일에 설정한 환경 값에 따라 적용됩니다.
@DataJpaTest 예시
1.Book
1 |
|
2.BookRepository
1 | public interface BookRepository extends JpaRepository<Book, Integer> { |
3.BookJpaTest
1 | import org.hamcrest.collection.IsEmptyCollection; |
Reference
- 처음으로 배우는 스프링부트 2 - 김영재