스프링 부트는 테스트의 편의성 제공을 위해 스프링부트 테스트 스타터를 제공한다.spring-boot-starter-test
스타터를 제공하며 이 스타터에는 spring-boot-test
와 spring-boot-test-autoconfigure
라는 두 개의 스프링 부트 테스트 모듈을 포함하고 있다.
spring-boot-test 의존성
spring-boot-test-autoconfigure 의존성
test-auto-configuration 목록
스프링 부트 테스트 스타터는 테스트에 유용한 라이브러리를 포함하고 있다.
- JUnit: Java 어플리케이션 단위 테스트 시 표준(사실상).
- Spring Test & Spring Boot Test: 스프링부트 어플리케이션을 위한 유틸리티 및 통합 테스트 지원
- AssertJ: assertion 라이브러리
- Hamcrest: JUnit에 사용되는 라이브러리(테스트 표현식을 문맥스럽게 ex. not, anyOf)
- Mockito: Java Mock 프레임워크
- JSONassert: JSON assertion 라이브러리
- JsonPath: JSON 데이터를 표현식으로 처리하기 위한 라이브러리
스프링부트 1.4 버전 이전에는 아래와 같은 코드를 작성해야 했다.
1 | (SpringJUnit4ClassRunner.class) |
스프링부트 1.4 버전 이후부터는 @SpringBootTest 어노테이션으로 통합되었다.
스프링부트는 표준 스프링 테스트의 @ContextConfiguration 어노테이션을 대체하여 @SpringBootTest를 제공한다.
주의할 점은 JUnit 4를 사용한다면 @RunWith(SpringRunner.class)를 추가해야한다. 만약 이를 추가하지 않을 경우 @SpringBootTest 어노테이션을 무시한다. 만약 JUnit 5를 사용한다면 @ExtendWith(SpringExtension.class)를 추가한다. 해당 어노테이션은 @SpringBootTest에 이미 포함 되어있다.
webEnvironment attribute
기본적으로 SpringBootTest 어노테이션을 사용할 경우 서버를 기동하지 않는다.
만약 서버와 관련된 설정을 하고자 한다면 webEnvironment 속성을 사용해야한다.
1 | (SpringRunner.class) |
이와 같이 webEnviroment 속성을 이용하여 웹 테스트 환경을 구축한다.
- MOCK(Default) : Web ApplicationContext를 로드하며 임베디드 서버가 아닌 Mock 서블릿을 제공한다. @AutoConfigureMockMvc 혹은 @AutoConfigureWebTestClient 어노테이션을 통해 Mock MVC 테스팅이 가능하다.
- RANDOM_PORT : WebServerApplicationContext를 로드하며 임베디드 서버를 구동한다. 랜덤 포트를 제공한다.
- DEFINED_PORT : WebServerApplicationContext를 로드하며 임베디드 서버를 구동한다. application.properties에 정의된 포트를 제공하며 기본은 8080이다.
- NONE : ApplicationContext를 로드하며 서블릿 환경을 구성하지 않습니다.
1 | -- DEFINED_PORT 설정 시 |
주의해야할 점은 @Transactional 사용 시 테스트 종료 후 롤백 처리한다. 하지만 RANDOM_PORT나 DEFINED_PORT 이용하여 실제 서블릿 환경과 다른 경우 롤백이 수행되지 않는다.
value attribute
1 | (SpringRunner.class) |
기본적으로 SpringBootTest는 application.properties와 application.yml을 이용한다. value 속성을 이용하면 이 외에 다른 값을 주입 시킬 수 있으며 동일한 키의 경우 value에 등록된 값으로 오버라이딩한다.
properties attribute
앞서 설명한대로 기본적으로 SpringBootTest는 클래스패스 상의 properties와 yaml 파일을 이용한다. value 이외에도 properties 속성을 이용하면 해당 값을 변경할 수 있다.
1 | "name=testname"}) (properties = { |
프로퍼티스 파일 자체를 변경하여 사용하고자 한다면 @TestPropertySource
어노테이션을 이용한다.
ex. @TestPropertySource(“classpath:application.test.properties”)
단 주의해야할 점은 properties와 value를 함께 쓸 경우 에러가 발생한다. 둘 중 한 가지 속성만을 사용해야한다.
46.3 Testing Spring Boot Applications 및 Annotation Type SpringBootTest 참고