JUN 5: 내선 번호에 스프링 구성 요소 주입(모든 콜백 전/모든 콜백 후)
tl;dr: 모든 테스트를 실행하기 전에 사용자 지정 데이터 공급자를 Spring 구성 요소로 인스턴스화하려면 어떻게 해야 합니까?
스프링 구성 요소를 사용자 정의 Junit Jupiter 확장에 주입하는 현명한 방법이 있습니까?BeforeAllCallback
더beforeAll
메서드는 복잡한 프로세스를 트리거해야 합니다.MyTestClass
를 사용하여 실행됩니다.@ExtendWith(OncePerTestRunExtension.class)
.
Spring Boot 어플리케이션을 만들었습니다 (src/main/java
) 내 테스트를 제공합니다(src/test/java
)에 필요한 자료를 첨부합니다.데이터는 테스트를 준비하는 데 최대 몇 시간이 걸릴 수 있습니다.또한 일부 휴게소에 추상적으로 액세스할 수 있습니다.
데이터는 모든 검정 클래스의 프로세스 간에 변경되지 않습니다.그래서 저는 데이터를 한 번만 뽑아보고 싶습니다.
모든 시험을 한 반에 쓰는 것이 효과적일 것이지만, 다른 반으로 나누는 것이 더 나은 개요를 제공한다고 생각합니다.
에서beforeAll(ExtensionContext)
당신의 관습의 방법BeforeAllCallback
당신은 Spring에 접근할 수 있습니다.ApplicationContext
현재 테스트 클래스의 경우SpringExtension.getApplicationContext(extensionContext)
.
에서 사용자 정의 데이터 공급자를 스프링 구성 요소로 구성하는 경우ApplicationContext
그런 다음 에서 구성 요소를 검색할 수 있습니다.ApplicationContext
사용자의 내선 내선 내선 - 예를 들어, 을 통해applicationContext.getBean(MyDataProvider.class)
.
테스트 사이에 데이터를 처리하고 처리된 데이터를 저장해야 하는 경우 루트에 저장할 수 있습니다. ExtensionContext.Store
목성에서.봐ExtensionContext.getRoot()
그리고getOrComputeIfAbsent(...)
의 변종.ExtensionContext.Store
상세한 것은
다음은 데이터베이스에서 테스트 데이터를 설정하기 위해 구현한 방법입니다.dataSource
샘의 위 답변과 다음 답변을 결합하여 봄콩: https://stackoverflow.com/a/51556718/278800
import javax.sql.DataSource;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit.jupiter.SpringExtension;
public class TestDataSetup implements BeforeAllCallback, ExtensionContext.Store.CloseableResource {
private static boolean started = false;
private DataSource dataSource;
@Override
public void beforeAll(ExtensionContext extensionContext) {
synchronized (TestDataSetup.class) {
if (!started) {
started = true;
// get the dataSource bean from the spring context
ApplicationContext springContext = SpringExtension.getApplicationContext(extensionContext);
this.dataSource = springContext.getBean(DataSource.class);
// TODO: put your one-time db initialization code here
// register a callback hook for when the root test context is shut down
extensionContext
.getRoot()
.getStore(ExtensionContext.Namespace.GLOBAL)
.put("TestDataSetup-started", this);
}
}
}
@Override
public void close() {
synchronized (TestDataSetup.class) {
// TODO: put your db cleanup code here
}
}
(나는 이것의 스레드 안전성에 대해 100% 확신할 수 없어서, 나는 다음을 추가했습니다.synchronized
안전을 위해 차단합니다.)
이 확장을 활성화하려면 필요한 테스트 클래스에 이 주석을 추가하기만 하면 됩니다.
@ExtendWith(TestDataSetup.class)
좋은 점은 Junit 5가 다중 확장을 허용하기 때문에 테스트에 이미 주석이 달렸더라도 이는 작동합니다.@ExtendWith(SpringExtension.class)
.
언급URL : https://stackoverflow.com/questions/56904620/junit-5-inject-spring-components-to-extension-beforeallcallback-afterallcall
'programing' 카테고리의 다른 글
typescript 컴파일러(tsc) 명령이 tscconfig에서 작동하지 않습니다. (0) | 2023.06.26 |
---|---|
@구성 속성 대 @PropertySource 대 @Value (0) | 2023.06.26 |
Angular 5에서 뷰를 렌더링하기 전에 데이터 대기 (0) | 2023.06.26 |
Laravel-Echo가 Vue.js를 통해 개인 채널을 구독하지 않음 (0) | 2023.06.26 |
오류: 데이터 및 소금 인수가 필요합니다. (0) | 2023.06.26 |