如何在 Spring Boot 测试中获取正在运行的服务器端口?

Posted

技术标签:

【中文标题】如何在 Spring Boot 测试中获取正在运行的服务器端口?【英文标题】:How to get the running server port in a SpringBoot test? 【发布时间】:2019-04-30 15:10:37 【问题描述】:

我正在为带有 Apache Camel 路由的 Spring Boot 应用程序创建一些单元测试,使用 Spock 作为测试框架,我需要模拟来自另一个应用程序的响应。我为此制作了一个模拟控制器,但我需要将运行测试的端口注入到一个属性中。有没有办法获取运行测试的端口?

我试过了

@LocalServerPort
private int port 

@Autowired Environment environment;
String port = environment.getProperty("local.server.port");

但两者都返回 -1,我不知道有什么其他方法可以获取端口

我的测试配置了以下注解:

@RunWith(SpringRunner)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles('test')

另外,有没有办法在application-test.yml 文件中注入那个随机端口?理想情况下,我需要在我的application-test.yml 文件中执行类似的操作:

app:
  service: localhost:$server.port

其中端口是运行测试的随机端口。

【问题讨论】:

***.com/questions/30312058/… 或 ***.com/questions/51628943/… ***.com/questions/52301056/… 大家好,这些答案对我不起作用,每个都为端口返回一个空值 【参考方案1】:

你可以试试这个:

@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
    public class test

    @LocalServerPort
    private int rdmServerPort;

    @LocalManagementPort
    private int rdmManagementPort;
        ...

【讨论】:

WebEnvironment.RANDOM_PORT 是这里的关键。如果您使用默认的模拟 Web 环境,则不会启动任何嵌入式容器。结果,不涉及端口,-1 将被注入。 @AndyWilkinson 看起来 op 已经在使用它了。如果使用RANDOM_PORT,有没有办法在属性文件中引用它,如 OP 所说的app.service=localhost:$server.port(未明确定义 server.port)

以上是关于如何在 Spring Boot 测试中获取正在运行的服务器端口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中模拟数据库连接以进行测试?

spring-boot 单元测试获取应用程序属性

如何防止我的 Spring Boot Batch 应用程序在执行测试时运行?

如何在 AWS 上运行的 Spring Boot 应用程序上本地运行集成测试?

如何在使用 DataJpaTest 的 Spring Boot 2.0 测试中访问 H2 控制台

如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口