@SpringBootTest 속성 및 슬라이스테스트(단위테스트)
● @SpringBootTest 및 test Slices(Auto-configuration Annotations)
@SpringBootTest는 Spring Main Application(@SpringBootApplication)을 실행할때와 동일한 모든 Bean을 스캔하여 mock bean을 생성합니다.
통합테스트 | 슬라이스테스트(단위테스트) | |
어노테이션 | @SpringBootTest | @DataCassandraTest @DataJdbcTest @DataJpaTest @DataLdapTest @DataMongoTest @DataNeo4jTest @DataR2dbcTest @DataRedisTest @JdbcTest @JooqTest @JsonTest @RestClientTest @WebFluxTest @WebMvcTest @WebServiceClientTest |
설명 | 실제 운영 환경에 가까운 모든 의존성을 제공 | 특정 범위의 테스트가 필요할 경우 활용되며 해당 단위테스트에 필요한 범위의 의존성을 제공 |
장점 | 실제 운영 환경에 가까운 테스트가 가능하기 때문에 이슈가 적다 | 원하는 범위의 테스트에 대해 빠른 결과를 얻을 수 있다 |
단점 | 간단한 테스트를 한다고 해도 모든 환경을 로드하기 때문에 시간이 오래 걸린다. | 모든 환경을 테스트하는 것이 아니기 때문에 단위테스트 외에서 문제가 발생할 수 있다. |
● @SpringBootTest 어노테이션 옵션
1. properties (value 또는 생략으로 입력해도 동일하게 동작한다)
- 속성 값을 정의한다
@SpringBootTest( properties = { "testId=born", "testName=탄생" } )
//@SpringBootTest( value = { "testId=born", "testName=탄생" } )
//@SpringBootTest( { "testId=born", "testName=탄생" } )
class TestApplication {
@Value("${testId}")
private String testId;
@Value("${testName}")
private String testName;
}
2. args
- application의 agruments를 삽입한다
@SpringBootTest( args = {"--app.test=one", "--app.test2=two"} )
class TestApplication {
@Value("${app.test}")
private String appTest;
@Autowired
private ApplicationArguments args;
@BeforeEach
public void setUp() {
assertThat(args.getOptionNames()).containsOnly("app.test");
assertThat(args.getOptionValues("app.test")).containsOnly("one");
}
}
3. classes
- 기본적으로 @SpringBootTest 는 모든 빈을 등록합니다. 하지만 classes 속성을 정의한다면 해당 클래스의 빈만 정의됩니다. config 설정이 있다면 해당 classes로 등록해줘야 한다.
@SpringBootTest(classes = {ArticleServiceImpl.class, CommonConfig.class})
class TestApplication {
@Autowired
private ArticleServiceImpl articleServiceImpl;
@Autowired
private RestTemplate restTemplate;
}
4. WebEnvironment
- WebEnvironment.MOCK : 아무런 설정이 없을 시 적용되는 디폴트 설정이다.
mock 서블릿 환경으로 내장톰캣이 구동되지 않는다.(브라우저에서 접속되지 않는다.)
- WebEnvironment.RANDOM_PORT : 스프링부트를 직접 구동시킨 것처럼 내장톰캣이 구동되나 랜덤포트로 구동된다.
- WebEnvironment.DEFINED_PORT : 정의된 포트로 내장톰캣이 구동된다
- WebEnvironment.NONE : WebApplicationType.NONE으로 구동된다.
● 테스트를 위한 TestRestTemplate 빈과 WebTestClient 빈을 등록할 수 있다.
만일 WebEnvironment.MOCK 이라면 TestRestTemplate과 WebTestClient빈은 등록되지 않는다. 실제 내장톰캣이 구동되지 않으므로 사용할 여지가 없고 어플리케이션에 요청을 보내고 싶다면 MockMvc로 테스트하면 되기 때문이다.
● 참고 사이트
https://yangbox.tistory.com/36
https://meetup.toast.com/posts/124
출처 : https://myborn.tistory.com/15?category=1030862