在任何测试运行之前,我使用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服务器。
2条答案
按热度按时间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
fkaflof62#
在类似的案例中对我有效的是:
创建了自己的注解并在其中指定扩展名
这在我的情况下保持了秩序