1. SpringBootTest
- Dependency[SpringBootTest]
- JUNit 5
- Java Application의 Unit Test를 위한 Test Tool
- Spring Test & Spring Boot Test
- SpringBoot Application에 대한 유틸리티 및 통합 Test를 지원함
- AssertJ
- 유연한 검증 라이브러리임
- Hamcrest
- Object Matcher를 위한 라이브러리임
- Mockito
- Java Mocking FrameWork임
- JSONassert
- JSON 검증을 위한 Tool
- JsonPath
- JSON용 XPath
- Annotation[SpringBootTest]
- @SpringBootTest
- @WebMvcTest
- @DataJpaTest
- @RestClientTest
- @JsonTest
- @JdbcTest
- @Autowired & @MockBean & @SpyBean
- 실제 Spring 컨텍스트를 사용해 Bean들을 등록함
- 등록된 Bean을 주입 받는 Annotation은 ⇒ @Autowired
- 특정 Object를 Mocking하고 싶은 경우는 ⇒ @MockBean, @SpyBean
- @MockBean ⇒ “해당 Object를 Mock된 Bean으로 등록함”
- @SpyBean ⇒ “해당 Object를 Spy된 Bean으로 등록함”
- 만약 @MockBean으로 선언한 Bean이 없다면 Mock Object를 bean으로 등록하지만, 동일한 Type과 이름의 Bean이 존재하면 해당 Bean은 Mock Bean으로 대체됨
- @SpyBean은 Spring 프록시가 적용된 Bean이면 사용이 불가능함, 프록시를 제거 후 사용해야함
- @SpringBootTest & @WebMvcTest & @DataJpaTest
- @SpringBootTest
- 통합 Test를 위한 환경을 준비해줌
- 모든 Bean들을 Scan하고 Application 컨텍스트를 생성하여 Test를 실행함
- 다양한 Value를 줄 수 있음
- value & properties - Application 실행에 필요한 Properties를 key=value 형태로 추가할 수 있음
- args - Application의 arguments로 값을 전달 할 수 있음
- classes - Application을 Loading할 때 사용되는 Component Class들을 정의 할 수 있음
- webEnviroment - web test환경을 설정할 수 있음
- @SpringBootTest - webEnvironment
- MOCK
- Web 기반의 Application 컨텍스트를 생성하지만, MOCK환경으로 제공하여 내장 SERVER가 시작되지 않음
- WEB 환경이 클래스패스에 없다면 WEB이 아닌 Application 컨텍스트를 생성함
- WEB기반의 Mock Test를 위해 @AutoConfigureMockMvc or @AutoConfigureWebTestClient와 함께 사용할 수 있음
- RANDOM_PORT
- WEB기반의 Application 컨텍스트를 생성하여 실제 WEB환경을 제공함
- 내장 Server도 실행되며 사용하지 않는 Random port를 listen함
- DEFINDED_PORT
- WEB 기반의 Application 컨텍스트를 생성하고 실제 WEB환경을 제공함
- 내장 Server도 실행되며 지정한 Port(default 8080)를 listen함
- NONE
- SpringApplication로 Application 컨텍스트를 생성함
- mock이나 다른 것들을 포함해 어떠한 WEB환경도 제공하지 않음
- webEnvironment의 default값은 MOCK이므로 실제 WEB Server가 실행되지 않음!
- @Transactional이 있으면 Test가 끝나고 트랜잭션을 롤백하는데, RANDOM_PORT나 DEFINDED_PORT를 사용하면 별도의 쓰레드에서 실제 Server가 구동되어 롤백이 되지 않음
- RANDOM_PORT, DEFINED_PORT를 사용하면 TestRestTemplate이 Dependency로 추가되므로 API 호출이 필요할 때 이용할 수 있음
- @SpringBootTest단점 & Slice Test
- @SpringBootTest는 기본적으로 모든 Bean을 탐색하고 등록을 함
- 특정 계층만 Test가 필요한 상황에 @SpringBootTest를 사용하면 불필요하게 무거워지고, 시간이 오래걸림!
- Spring에서 특정 부분만 Test할 수 있도록 Slice Test를 제공해주는데, Slice Test는 Spring 컨텍스트를 구성하므로 통합테스트에 해당됨
- @WebMvcTest - Controller
- Application 컨텍스트를 만들 때 Controller와 연관된 Bean들만을 제한적으로 찾아서 등록함
- @Component, @ConfigurationProperties Bean들은 Scan되지 않음
- @Controller, @RestController
- @ControllerAdvice, @RestControllerAdvice
- @JsonComponent
- Filter
- WebMvcConfigurer
- HandlerMethodArgumentResolver
- @Import를 사용할 수 있으며, @MockBean, SpyBean 도 사용이 가능함
- @WebMvcTest는 Controller Test이므로 @WebMvcTest 내부에 @AutoConfigureMockMvc가 있음
- @Autowired로 MockMvc를 주입 받을 순 있지만, 만약 WebFlux를 이용중이면 @WebFluxTest를 사용하면 됨
- @WebMvcTest - value, controllers
- 특정 Controller만 Bean으로 등록하다록 제한 할 수 있음
- [주의]
- 특정 Controller만을 Bean으로 띄우고 @MockBean과 @SppyBean으로 특정 Bean을 바꾸는 것은 새로운 Application 컨택스트를 필요로 하는데, 계속해서 수를 증가시키는 문제가 발생하므로 사용 시 주의해야함!
- @DataJpaTest - JPA Repository
- @DataJpaTest
- @Entity가 있는 Entity calss들을 Scan하며 Test를 위한 TestEntityManager를 사용해 JPA Repository들을 설정해줌
- @Component, @ConfigurationProperties Bean들은 Scan 되지 않음을 알아야함
- @DataJpaTest의 기본적인 동작
- Spring Test에 @Transactional이 있으면 Test가 끝난 후 Auto로 트랜잭션을 롤백함
- @Transactional Annotation이 들어 있어서 기본적으로 모든 Test가 롤백이 가능함
- @Rollback(false)를 설정하면 롤백을 하지 않음!
- H2간은 내장 DB가 클래스 패스에 존재하면 내장 DB가 Auto로 구성됨
- spring-boot-test dependency에는 기본적으로 h2가 들어있으며 별다른 설정을 주지 않으면 h2로 설정이 됨
- 내장 DB로 설정되기 원하지 않으면, AutoConfigureTestDatabase의 replace 속성을 NONE을 주면 됨
- Application 컨텍스트 캐싱
- 내부적으로 Spring 컨텍스트를 캐싱해두고 동일한 설정이라면 재사용함을 말함
- Test시 새로운 컨텍스트를 생성하도록 요구함
- @MockBean과 @SpyBean은 특정 Bean을 Mock이 적용된 Bean으로 등록함
- Application 컨텍스트가 갖는 Bean이 달라져 새로운 컨텍스트를 생성함
- @MockBean과 @SpyBean을 많이 사용하면 Test가 느려질 수 있기에, 캐싱된 Application의 수를 증가시킴
- Test Class에서 @MockBean과 @SpyBean이 적용된 Object가 완전히 동일하다면 재사용이 가능함
- SpringBootTest - Annotation 정리