4.3.1 用随机端口启动服务器
前面提到过,此处的默认行为是启动服务器监听 8080 端口。在一台机器上一次只运行一个测试的话,这没什么问题,因为没有其他服务器监听 8080 端口。但如果你和我一样,本机总是有其他服务器在监听 8080 端口,那该怎么办?这时测试会失败,因为端口冲突,服务器启动不了。一定要有更好的办法才行。
幸运的是,让 Spring Boot 在随机选择的端口上启动服务器很方便。一种办法是将 server.port
属性设置为 0
,让 Spring Boot 选择一个随机的可用端口。 @WebIntegrationTest
的 value
属性接受一个 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论