Springboot Test
Springboot Test
백기선님의 강의인 Springboot 개념과 활용 강의를 듣고 공부한 내용을 정리한 글
Test
spring-boot-starter-test
를 추가하는 것으로 시작한다.
테스트 코드를 작성할 때 @SpringbootTest를 붙여서 사용한다.
또한 @SpringbootTest에 webEnviroment를 매개변수로 받는데 총 3가지 옵션이 존재한다.
MOCK, (RANDOM_PORT,DEFINED_PORT), NONE
MOCK은 내장 톰캣 구동을 안한다는 뜻이고 디스패처 서블릿과 유사한 기능을 하도록 가짜 서블릿 컨테이너를 띄운다는 옵션이다.
RANDOM_PORT과 DEFINED_PORT은 내장 톰캣을 사용한다는 옵션이며 NONE은 서블릿 환경을 제공하지 않겠다는 의미이다.
RANDOM_PORT
RANDOM_PORT 옵션을 사용하면 실제 내장 톰캣을 실행할 수 있는데 이때는 MockMVC가 아닌, TestRestTemplate를 사용해야한다.
TestRestTemplate은 getForObject(url,타입)을 명시함으로써 값을 받아올 수 있다.
또한 이 때 Test용 Mock을 만들 수 있는데, @MockBean 애노테이션을 사용하면 해당 객체에 Mock 객체를 주입해준다.
Spring 5에 추가된 WebTestClient를 사용할 수 있는데, 이 WebTestClient와 기존 TestRestTemplate과의 차이는 WebTestClient는 Asynchronous하게 작동한다는 특징이 있다.
SpringbootTest의 단점
@SpringbootTest는 주로 통합테스트를 할 때 사용하는 애노테이션으로써 소스코드의 @SpringbootApplication 애노테이션을 찾고 모든 빈들을 등록한다.
그 후 @MockBean에 해당하는 빈만 교체를 해주는데 그러다 보니 유닛테스트 치고는 실행 시간이 많이 걸리게 된다.
이를 위해 Spring에서는 SliceTest를 지원해주는데, @WebMvcTest, @JsonTest, @WebFluxTest, @DataJpaTest 등이 있다.
이렇게 Slice 테스트를 진행하게 되면 특정 Bean들만 등록하기 때문에 아무래도 조금 더 가벼운 테스트가 가능하다는 장점이 있다.
테스트 유틸
OutputCapture에 관해 알아보자.
OutputCapture는 로그를 비롯해 콘솔에 찍히는 모든걸 Capture한다.
일반적으로 로그 메시지를 테스트할 때 사용한다.
Reference
인프런 백기선님의 스프링 부트 개념과 활용