programing

JUN 5: 내선 번호에 스프링 구성 요소 주입(모든 콜백 전/모든 콜백 후)

lastmoon 2023. 6. 26. 21:37
반응형

JUN 5: 내선 번호에 스프링 구성 요소 주입(모든 콜백 전/모든 콜백 후)

tl;dr: 모든 테스트를 실행하기 전에 사용자 지정 데이터 공급자를 Spring 구성 요소로 인스턴스화하려면 어떻게 해야 합니까?

스프링 구성 요소를 사용자 정의 Junit Jupiter 확장에 주입하는 현명한 방법이 있습니까?BeforeAllCallbackbeforeAll메서드는 복잡한 프로세스를 트리거해야 합니다.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

반응형