如何修改已注册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
相关产品推荐
相关产品推荐

