SpringBoot测试:如何在应用上下文加载前启动WireMockServer
确保WireMockServer在SpringBoot应用上下文加载前启动的方案
以下是几种可靠的实现方式,能保证WireMockServer在Bean的@PostConstruct方法执行前启动:
方法一:使用ApplicationContextInitializer
实现Spring的ApplicationContextInitializer接口,它会在Spring上下文初始化(包括Bean实例化、@PostConstruct执行)之前触发,适合在这里启动WireMock:
public class WireMockInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { private static WireMockServer wireMockServer; static { wireMockServer = new WireMockServer(options().port(8089)); } @Override public void initialize(ConfigurableApplicationContext applicationContext) { if (!wireMockServer.isRunning()) { wireMockServer.start(); // 提前配置Stub wireMockServer.stubFor(get(urlEqualTo("/target-api")) .willReturn(aResponse().withStatus(200).withBody("mock data"))); } // 将实例注册到上下文,方便后续测试中复用 applicationContext.getBeanFactory().registerSingleton("wireMockServer", wireMockServer); } }
在测试类上指定初始化器:
@SpringBootTest @ContextConfiguration(initializers = WireMockInitializer.class) public class BusinessServiceTest { // 测试逻辑 }
方法二:JUnit 5 @BeforeAll静态方法
JUnit 5的@BeforeAll标注的静态方法会在Spring上下文创建前执行,可利用这个特性启动WireMock:
@SpringBootTest public class BusinessServiceTest { private static WireMockServer wireMockServer; @BeforeAll static void initWireMock() { wireMockServer = new WireMockServer(options().port(8089)); wireMockServer.start(); wireMockServer.stubFor(post(urlEqualTo("/target-api")) .willReturn(aResponse().withStatus(201))); } @AfterAll static void shutdownWireMock() { if (wireMockServer != null && wireMockServer.isRunning()) { wireMockServer.stop(); } } // 测试方法 }
方法三:自定义前置自动配置类
创建自动配置类,并通过@AutoConfigureBefore指定优先级,确保它在业务Bean的配置之前加载:
@Configuration @AutoConfigureBefore(YourApplicationMainClass.class) // 替换为你的主应用类 public class WireMockPreConfiguration { @Bean public WireMockServer wireMockServer() { WireMockServer server = new WireMockServer(options().port(8089)); server.start(); server.stubFor(get(urlEqualTo("/target-api")) .willReturn(aResponse().withBody("mock response"))); return server; } @PreDestroy public void stopServer(WireMockServer server) { if (server.isRunning()) { server.stop(); } } }
测试类中导入该配置:
@SpringBootTest @Import(WireMockPreConfiguration.class) public class BusinessServiceTest { // 测试逻辑 }
注意事项
- 所有方案都要保证WireMockServer是单例实例,避免重复启动占用端口;
- 务必在测试结束后停止WireMockServer,可通过
@AfterAll或@PreDestroy实现; - 若使用官方
@AutoConfigureWireMock,默认启动时机晚于@PostConstruct,需结合上述方法调整启动顺序。
内容的提问来源于stack exchange,提问作者CurvedHalo
相关产品推荐
相关产品推荐

