java—如何在加载*spring测试上下文之前在junit 5*中获取回调?

pqwbnv8z  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(360)

在任何测试运行之前,我使用JUnit5扩展来启动wiremock服务器。但是,spring上下文中的一个bean在初始化过程中进行了一个远程调用,我无法更改,该调用导致connectionexception,因为wiremock服务器尚未启动。
如何配置JUnit5测试,以便在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();
  }
}

SpringBean配置深埋在我的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
  }
}

我的测试是这样的:

@SpringBootTest(properties = {...})
@ExtendWith(MyWiremockExtension.class)
class MyTest {
...
}

到目前为止,我找到的最接近的答案是如何在运行时为当前测试applicationcontext注册spring上下文事件,但这并没有在加载测试上下文之前为提供回调方法。
我最好的猜测是:
创建我自己的 ContextCustomizerFactory ,或
延伸 SpringBootTestContextBootstrapper ,覆盖 buildTestContext() 在调用之前启动wiremock super.buildTestContext() ,那么 @BootstrapWith 我的类而不是spring boot的类,尽管我不确定使用哪个回调来停止wiremock服务器。

ifmq2ha2

ifmq2ha21#

以下是对我有效的方法:
使用SpringTestContext框架实现它,这也使得它可以使用testng
实施 TestExecutionListener 使测试执行侦听器实现 Ordered 实施 getOrder 并返回小于2000的值(dependencyinjectiontestexecutionlistener的顺序)
样本代码https://github.com/marschall/spring-test-scope/blob/master/src/main/java/com/github/marschall/spring/test/scope/testscopetestexecutionlistener.java

fkaflof6

fkaflof62#

在类似的案例中对我有效的是:
创建了自己的注解并在其中指定扩展名

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

这在我的情况下保持了秩序

相关问题