사용자 도구

사이트 도구


springframework:springboot:test

SpringBoot Test

@SpringBootTest

  • 기본적인 SpringBoot 통합 테스트 어노테이션.
  • 이 안에 들어가면 @ExtendWith(SpringExtension.class)가 함께 지정되어 있어서 JUnit 5에서 자동 수행된다.

@ExtendWith(SpringExtension.class) 는 SpringBoot 2.1 부터 @SpringBootTest 와 그 하위 애노테이션(@DataJpaTest 등)에 기본 내장돼 있으므로 테스트 클래스에 지정할 필요가 없다.

@SpringBootApplication 클래스 탐지

  • @SpringBootTest 는 이 애노테이션이 지정된 클래스보다 아래에 있거나 동일 패키지 경로상의 상위 패키지에 존재하는 @SpringBootApplication 클래스도 자동 탐지한다.
  • classes={} 로 명시할 수도 있다.

테스트용 프라퍼티 지정

@SpringBootTest(properties = {"some.username=user", "some.password=pwd"},
                webEnvironment = SpringBootTest.WebEnvironment.NONE)

Context Cache

  • 기본적으로 Application Context 를 Cache 한다.
  • 하지만 일부 테스트의 설정에서 @MockBean, @SpyBean 등을 사용하면 컨텍스트가 오염되므로 새로운 컨텍스트가 생성되고 또 캐시 된다.
  • 이로인해 성능저하가 심해질 수 있으므로 되도록 컨텍스트를 하나 혹은 최소한의 공통으로 유지하는 것이 중요하다.
  • 캐시를 한다는 뜻은 새로운 컨텍스트를 생성해야 하는 상황에서 기존 컨텍스트를 그대로 유지하는 것이다.
  • 즉, DB 접속등이 이뤄지는 컨텍스트의 경우 connection pool 로 인해서 DB 서버의 커넥션 수가 꽉차는 상황이 발생할 수 있다.
  • Test 용 설정에서 Connection Pool의 min 사이즈는 작게 잡는게 좋다
  • DefaultContextCache : 기본 컨텍스트 캐시 구현체 spring.test.context.cache.maxSize 프라퍼티에 mb 단위로 지정.
# 32mb 기본값
spring.test.context.cache.maxSize=32

@TestConfiguration

  • Test 용 @Configuration
  • 기존 Bean 설정을 override 하거나 더 추가한다.
  • @Configuration 은 component scan 으로 자동으로 탐지되지만 @TestConfiguration 은 자동탐지를 하지 않고 import 명시할 때만 작동한다. 테스트시 오작동을 줄일 수 있다.
  • 혹은 @SpringBootTest 가 지정된 클래스의 static inner class 로 만들어 지정하면 자동 탐지한다.
  • Test 시에는 기존 bean 을 override 해야 할 수 있기 때문에 관련 프라퍼티를 지정한다. 가급적 production 코드에서는 false로 둬야한다.
spring.main.allow-bean-definition-overriding=true

Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

  • Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=…) with your test 라는 오류가 발생한다면 @SpringBootApplication 애노테이션이 붙은 클래스가 존재하는 패키지의 하위 패키지에 테스트를 둬야 한다는 원칙을 어긴 것이다.
  • 예: a.b.c.Application 이라면, 테스트 클래스는 a.b.c 아래의 패키지에 존재해야한다. 만약 a.b.x 처럼 돼있는 패키지에 테스트 클래스가 존재하면 자동으로 @SpringBootApplication을 탐색하지 못한다.
  • 보통 @SpringBootApplication이 존재하지않는 Library 성 모듈의 경우 발생한다.

해결 1

  • 테스트에 @EnableAutoConfiguration 추가,
  • 테스트 resourcesapplication.yml 필요(혹은 명시적 지정)
  • @SpringBootTest(classes = config 클래스 목록 지정)
@SpringBootTest(classes = MyServiceConfig.class, webEnvironment = SpringBootTest.WebEnvironment.NONE)
@EnableAutoConfiguration
class MyApplicationTests {
}

해결 2

  • 테스트 소스에 동일 패키지에 @SpringBootApplication 이 붙은 클래스를 하나 만들어주면 된다. 패키지만 동일하다면 classes지정 불필요.
  • 패키지 구조가 다르면 classes에 해당 @SpringBootApplication이 붙은 클래스를 지정해도 된다.
  • 테스트 resourcesapplication.yml 필요(혹은 명시적 지정)
@SpringBootTest(classes = SpringBootTestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE)
class MyApplicationTests {
}

@TestProperties

@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {
 
}
 
 
You can use @TestPropertySource
 
@TestPropertySource(
    properties = {
        "some.username=validate",
        "some.password=false"
    }
)

@WebFluxTest

참조

springframework/springboot/test.txt · 마지막으로 수정됨: 2022/08/31 16:02 저자 kwon37xi