如何配置WireMock动态端口解决Spring Boot集成测试Jenkins端口冲突
实现WireMock动态端口配置方案
1. 移除固定端口配置,启用动态端口
删除@WireMockTest注解中的httpPort固定端口配置,默认会自动分配操作系统空闲端口,通过@WireMockPort注解注入实际启动的端口:
// 不指定httpPort则默认启用动态端口 @WireMockTest class TestSomething { // 注入WireMock实际监听端口 @WireMockPort private Integer wiremockPort;
2. 动态覆盖下游服务配置
使用Spring Boot的@DynamicPropertySource注解,在测试上下文加载时动态替换yml中的下游服务地址,无需修改原有yml配置:
@DynamicPropertySource static void setDownstreamServiceUrl(DynamicPropertyRegistry registry) { String wiremockBaseUrl = "http://localhost:" + wiremockPort; registry.add("downstream.service.getSomeData.url", () -> wiremockBaseUrl); registry.add("downstream.service.getAuthToken.url", () -> wiremockBaseUrl); registry.add("downstream.service.someOtherClientMethod.url", () -> wiremockBaseUrl); }
3. 多测试类复用配置(可选)
如果有3个测试类都需要用到WireMock,可将通用配置抽取为抽象父类,避免重复编码:
@WireMockTest public abstract class AbstractWireMockIntegrationTest { @WireMockPort protected Integer wiremockPort; @DynamicPropertySource static void configureDownstreamUrls(DynamicPropertyRegistry registry) { String baseUrl = "http://localhost:" + wiremockPort; registry.add("downstream.service.getSomeData.url", () -> baseUrl); registry.add("downstream.service.getAuthToken.url", () -> baseUrl); registry.add("downstream.service.someOtherClientMethod.url", () -> baseUrl); } } // 业务测试类直接继承即可 class TestSomething extends AbstractWireMockIntegrationTest { // 原有测试逻辑无需修改 }
修改完成后,每次测试启动都会自动获取未被占用的端口,彻底解决Jenkins多任务并行时的端口冲突问题。
内容的提问来源于stack exchange,提问作者Ulukbek Abylbekov
相关产品推荐
相关产品推荐

