如何在加载 Spring 测试上下文之前*在 Junit 5 中获取回调?

Ste*_*e K 8 java spring spring-boot junit5

在运行任何测试之前,我使用 Junit 5 扩展来启动 Wiremock 服务器。然而,Spring 上下文中的一个 bean 在其初始化过程中进行了远程调用,我无法更改该调用,并且该调用会导致 ConnectionException,因为 Wiremock 服务器尚未启动。

如何配置 JUnit 5 测试以在之前获得回调以在Spring 加载文本上下文

我的 JUnit 5 扩展如下所示:

public class MyWiremockExtension implements BeforeAllCallback, AfterAllCallback {

  private final WireMockServer wireMock = new WireMockServer(...);
  
  @Override
  public void beforeAll(ExtensionContext extensionContext) throws Exception {
    wireMock.start();
  }

  @Override
  public void afterAll(ExtensionContext extensionContext) throws Exception {
    wireMock.stop();
  }
}
Run Code Online (Sandbox Code Playgroud)

Spring Bean 配置深埋在我的 OkHttpClient bean 所依赖的上游代码中,但它看起来像这样:

@Configuration
public class OkHttpClientConfiguration {

  @Bean
  OkHttpClient okHttpClient(...) {
    OkHttpClient okHttpClient = new OkHttpClient.Builder()...build();
    // wrap the okHttpClient in OAuth handling code which eagerly fetches a token
  }
}
Run Code Online (Sandbox Code Playgroud)

我的测试如下所示:

@SpringBootTest(properties = {...})
@ExtendWith(MyWiremockExtension.class)
class MyTest {
...
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我找到的最接近的答案是How to register Spring Context Events for current test ApplicationContext at runtime ,但在测试上下文加载之前没有提供回调方法。

我对如何做到这一点的最佳猜测是:

  1. 创建我自己的ContextCustomizerFactory,或者
  2. 扩展,在调用之前SpringBootTestContextBootstrapper覆盖以启动wiremock ,然后是我的类而不是Spring Boot的类,尽管我不确定我会使用哪个回调来停止wiremock服务器。buildTestContext()super.buildTestContext()@BootstrapWith

Ber*_*rka 1

在类似的情况下对我有用的是:

创建自己的注释并指定扩展名

@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(
    {
        MyWiremockExtension.class,
        SpringExtension.class,
    }
)
public @interface WireMockSpringTest {
Run Code Online (Sandbox Code Playgroud)

这保留了我的情况的顺序