You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:35:02