Spring Boot 3中如何用动态端口WireMock测试OpenAPI生成客户端
解决方案
方法1:使用@DynamicPropertySource动态绑定配置
这是Spring Boot测试中适配动态端口最直接的方案,通过该注解可以在测试运行时将WireMock的动态baseUrl注入到你的配置项中。
示例代码:
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import com.github.tomakehurst.wiremock.WireMockServer; class EchoClientIntegrationTest { // 初始化WireMock服务 private static final WireMockServer wireMockServer = new WireMockServer(); @BeforeAll static void startWireMock() { wireMockServer.start(); } @AfterAll static void stopWireMock() { wireMockServer.stop(); } // 动态绑定配置项到WireMock的baseUrl @DynamicPropertySource static void registerWireMockProperties(DynamicPropertyRegistry registry) { registry.add("rest.clients.echo.base-path", wireMockServer::baseUrl); } // 编写你的测试逻辑 @Test void testEchoClient() { // 这里注入的ApiClient已经自动使用WireMock的动态地址 } }
如果使用了wiremock-spring-boot-starter集成包,WireMockServer会被自动注册为Spring Bean,此时可以直接注入使用:
@DynamicPropertySource static void registerWireMockProperties(DynamicPropertyRegistry registry, WireMockServer wireMockServer) { registry.add("rest.clients.echo.base-path", wireMockServer::baseUrl); }
方法2:确保客户端配置类正确绑定配置
要让动态配置生效,你的客户端配置类需要正确绑定rest.clients.echo.base-path配置项,示例如下:
@Configuration @ConfigurationProperties(prefix = "rest.clients.echo") public class EchoClientConfiguration { private String basePath; // Getter和Setter public String getBasePath() { return basePath; } public void setBasePath(String basePath) { this.basePath = basePath; } @Bean public ApiClient echoApiClient() { ApiClient apiClient = new ApiClient(); // 使用绑定的basePath覆盖生成代码中的默认值 apiClient.setBasePath(basePath); return apiClient; } }
关键说明
@DynamicPropertySource是Spring Boot 2.2+提供的特性,Spring Boot 3完全支持,它会在测试启动时优先覆盖application.properties/yaml中的静态配置。- 无需硬编码端口,WireMock每次启动的随机端口会自动同步到你的REST客户端配置中,保证测试环境的一致性。
内容的提问来源于stack exchange,提问作者u4963840
相关产品推荐
相关产品推荐

