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

在Mock环境下运行Spring Boot集成测试时获取服务器端口

Spring Boot Mock环境下RestClient Bean创建失败问题

我的Spring Boot集成测试类如下:

@SpringBootTest(webEnvironment = RANDOM_PORT, classes = RestSpringBeans.class)
public interface ApiTestConfiguration {
    // tests omitted
}

在RestSpringBeans中,我定义了测试所用的部分Bean,包括以下这个:

@Lazy
@TestConfiguration
@Import(BootstrapData.class)
public class RestSpringBeans {

    @Bean
    RestClient restClient(@LocalServerPort int port, @Autowired RestClient.Builder restClientBuilder) {
        return restClientBuilder.baseUrl("http://localhost:" + port).build();
    }
}

我希望切换到Mock环境,只需删除@SpringBootTest中的webEnvironment属性即可(因为Mock环境是默认选项)。修改后,创建RestClient Bean时出现以下错误:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'local.server.port' in value "${local.server.port}"

尝试方案1(未成功)

我尝试设置配置属性server.port = 9999,并使用@Value("${server.port}")替代@LocalServerPort注入,但未生效。

尝试方案2(未成功)

以下代码在webEnvironment = RANDOM_PORT时可用,但在webEnvironment = MOCK时,local.server.port属性为null:

@Bean
RestClient restClient(@Autowired Environment environment, @Autowired RestClient.Builder restClientBuilder) {
    var port = environment.getProperty("local.server.port", Integer.class);
    return restClientBuilder.baseUrl("http://localhost:" + port).build();
}

最小复现示例

基于示例项目的指定分支,可通过以下步骤复现问题:

  1. 运行RandomPortTests,确认非Mock环境下测试通过
  2. 运行MockRestClientTests,观察Mock环境搭配RestClient时测试失败(服务器端口已定义在application.properties中)
  3. 运行MockWebClientTests,确认Mock环境搭配WebTestClient时测试通过

若先启动服务器再执行步骤2,测试可通过,但步骤3无需启动服务器即可成功。既然二者仅Web客户端库不同,Mock环境下的RestClient也应该能实现无服务器启动运行。

内容的提问来源于stack exchange,提问作者Dónal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:04:54