https://meetup.toast.com/posts/124
spring boot test 모듈은 아래의 2개가 존재함
- spring-boot-test
- spring-boot-test-autoconfigure
대부분 spring-boot-starter-test로 충분함(위의 2개를 다 포함하고 있나?)
@SpringBootTest
@ContextConfiguration의 발전된 기능?
테스트에 사용할 ApplicationContext를 쉽게 조작할 수 있음
반드시 @RunWith(SpringRunner.class)와 함께 사용해야함
-
Bean 설정
- classes 속성을 통해 할 수 있음
- 설정한 클래스들만 빈으로 등록함
- @Configuration을 설정할 경우 내부의 빈들도 전부 등록됨
-
@TestConfiguration
- 기존에 정의한 @Congifuration을 재정의하고 싶을 경우
- @TestConfiguration에 정의된 bean으로 override 된다
- 테스트 클래스내에 선언할수도 있지만, 이러면 @ComponentScan시에만 감지되므로 classes를 명시했을 경우 사용할 수 없다는 단점이 있다
- @Import를 써서 직접 사용하는 것이 더 좋다
- 이렇게 하면 여러클래스에서도 사용할 수 있다
-
@MockBean
- @MockBean 어노테이션을 사용하면 mock 객체를 빈드로 등록할 수 있다
- @Autowired 등으로 주입받는 객체가 @MockBean으로 선언된 객체라면, 해당 mock 객체가 주입된다
- @MockBean으로 선언한 객체가 이미 빈에 등록되어져 있다면 override 된다
-
properties
- 스프링은 테스트시에 기본적으로 class path의 application.properties(yml)을 참조한다
- properties 속성으로 별도의 테스트를 위한 설정파일을 지정할 수 있다
- test classpath의 application.yml이 있으면 그걸 먼저 참조…하나?
TestRestTemplate
- @SpringBootTest와 RestTestTemplate를 같이 사용한다면 편리하게 웹 통합테스트가 가능하다
- @SpringBootTest에서 Web Environment를 설정했다면 TestRestTemplate는 그에맞춰 자동으로 빈으로 생성된다
- MockMvc는 servlet container를 생성하지 않고, TestRestTemplate는 servlet container를 생성함
- 그러므로 실제 동작되는 것처럼 테스트를 수행할 수 있다
- 클라이언트가 수행하는 것 처럼 테스트할 수 있다
트랜잭션
-
@Test 어노테이션과 @Transactional 어노테이션을 함꼐 사용했을 경우 테스트가 끝나면 rollback 됨
- 기존의 spring-test와 동일
- 만약 롤백하고 싶지 않다면 아래와 같이 함
1
2
3
4
5
false) (
public void insetTest(){
// ...
}
-
하지만 webEnvironment의 RANDOM_PORT나 DEFINED_PORT로 테스트를 설정하면 테스트가 별도의 스레드에서 수행되기 때문에 rollback이 수행되지 않음
@JsonTest
- json serialize, deserialize를 편하게 테스트해볼 수 있다
@WebMvcTest
- 서버사이드 API Test?
Async web Test
- async 테스트?
@DataJpaTest
- memory db를 사용하고 테스트가 끝날떄마다 롤백됨
- @Transactional 어노테이션을 포함하고 있음
- 테스트를 위한 TestEntityManager 클래스가 빈으로 등록된다
- Spring Data JPA를 쓰지 않을 경우 유용할까?
@JdbcTest
- @DataJpaTest와 유사하게 순수 JDBC를 테스트하고 싶을 경우 사용
- 테스트를 위한 JdbcTemplate가 생성된다
@DataMongoTest
- mongodb
@RestClientTest
- 좀 더 리얼환경에 가깝게 api 테스트를 할 수 있음
- RestTemplate에 반응하는 가상의 mock 서버라고 생각하면 된다?