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

如何修改已注册WireMockExtension的运行时端口?

运行时修改WireMock端口的方案

一、使用@RegisterExtension的限制

用@RegisterExtension注册的WireMockExtension无法在运行时修改端口。JUnit 5的Extension机制会在测试类初始化阶段启动WireMock服务器,一旦服务器启动,端口就完成绑定,WireMock本身没有提供动态变更端口的API,且WireMockExtension也未暴露修改配置或重启服务器的方法。

二、手动管理WireMock服务器的替代方案

若需动态修改端口,可以放弃@RegisterExtension,手动创建并管理WireMockServer实例,以此实现运行时关闭旧服务器、启动新端口服务器的需求,同时保留存根(stubbing)能力。

示例代码如下:

@ExtendWith(SpringExtension.class)
public class BaseIntegrationTest {
    private WireMockServer wm;

    // 初始化默认端口的服务器
    @BeforeEach
    void setUp() {
        startWireMockServer(12345);
    }

    // 关闭服务器,避免端口占用
    @AfterEach
    void tearDown() {
        if (wm != null && wm.isRunning()) {
            wm.stop();
        }
    }

    public void changePort(int newPort) {
        // 先关闭当前运行的服务器
        if (wm != null && wm.isRunning()) {
            wm.stop();
        }
        // 启动新端口的服务器
        startWireMockServer(newPort);
    }

    private void startWireMockServer(int port) {
        wm = new WireMockServer(wireMockConfig().port(port).extensions(NoKeepAliveTransformer.class));
        wm.start();
        // 可在此设置全局存根,后续也能通过wm实例添加存根
        // wm.stubFor(get(urlEqualTo("/test")).willReturn(aResponse().withStatus(200)));
    }

    // 测试中使用wm进行存根
    @Test
    void testDynamicPort() {
        // 使用默认端口添加存根
        wm.stubFor(get(urlEqualTo("/default")).willReturn(aResponse().withBody("default")));
        
        // 修改端口到123
        changePort(123);
        
        // 在新端口添加存根
        wm.stubFor(get(urlEqualTo("/new")).willReturn(aResponse().withBody("new")));
        
        // 执行测试逻辑...
    }
}

方案说明

  • 手动管控生命周期:通过@BeforeEach和@AfterEach分别初始化、销毁服务器,保证测试前后环境干净。
  • 动态切换端口:changePort方法先关闭当前运行的服务器,再以新端口启动实例,后续存根操作均基于新实例。
  • 存根能力保留:所有存根操作直接调用wm实例,和使用WireMockExtension时的存根方式完全一致。

内容的提问来源于stack exchange,提问作者Justin Xu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:50:36