返回介绍

4.3.1 用随机端口启动服务器

发布于 2025-04-21 21:10:08 字数 1571 浏览 0 评论 0 收藏

前面提到过,此处的默认行为是启动服务器监听 8080 端口。在一台机器上一次只运行一个测试的话,这没什么问题,因为没有其他服务器监听 8080 端口。但如果你和我一样,本机总是有其他服务器在监听 8080 端口,那该怎么办?这时测试会失败,因为端口冲突,服务器启动不了。一定要有更好的办法才行。

幸运的是,让 Spring Boot 在随机选择的端口上启动服务器很方便。一种办法是将 server.port 属性设置为 0 ,让 Spring Boot 选择一个随机的可用端口。 @WebIntegrationTestvalue 属性接受一个 String 数组,数组中的每项都是键值对,形如 name=value ,用来设置测试中使用的属性。要设置 server.port ,你可以这样做:

@WebIntegrationTest(value={"server.port=0"})

另外,因为只要设置一个属性,所以还能有更简单的形式:

@WebIntegrationTest("server.port=0")

通过 value 属性来设置属性通常还算方便。但 @WebIntegrationTest 还提供了一个 randomPort 属性,更明确地表示让服务器在随机端口上启动。你可以将 randomPort 设置为 true ,启用随机端口:

@WebIntegrationTest(randomPort=true)

既然我们在随机端口上启动了服务器,就需要在发起 Web 请求时确保使用正确的端口。此时的 getForObject() 方法在 URL 里硬编码了 8080 端口。如果端口是随机选择的,那在构造请求时又该怎么确定正确的端口呢?

首先,我们需要以实例变量的形式注入选中的端口。为了方便,Spring Boot 将 local.server.port 的值设置为了选中的端口。我们只需使用 Spring 的 @Value 注解将其注入即可:

@Value("${local.server.port}")
private int port;

有了端口之后,只需对 getForObject() 稍作修改,使用这个 port 就好了:

rest.getForObject(
    "http://localhost:{port}/bogusPage", String.class, port);

这里我们在 URL 里把硬编码的 8080 改为 {port} 占位符。在 getForObject() 调用里把 port 属性作为最后一个参数传入,就能确保该占位符被替换为注入 port 的值了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。