在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(); }
最小复现示例
基于示例项目的指定分支,可通过以下步骤复现问题:
- 运行
RandomPortTests,确认非Mock环境下测试通过 - 运行
MockRestClientTests,观察Mock环境搭配RestClient时测试失败(服务器端口已定义在application.properties中) - 运行
MockWebClientTests,确认Mock环境搭配WebTestClient时测试通过
若先启动服务器再执行步骤2,测试可通过,但步骤3无需启动服务器即可成功。既然二者仅Web客户端库不同,Mock环境下的RestClient也应该能实现无服务器启动运行。
内容的提问来源于stack exchange,提问作者Dónal
相关产品推荐
相关产品推荐

