如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口
Posted
技术标签:
【中文标题】如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口【英文标题】:How to change server port in runtime with a spring boot application and spock testing 【发布时间】:2019-07-03 02:15:34 【问题描述】:我正在使用 Spock 测试 Spring Boot 应用程序,但在其中一个测试用例中,我需要模拟或存根对身份验证服务器的调用(使用 oauth 2),因此我试图将请求重定向到虚拟服务器用于测试并使方法返回固定令牌。但是,我在运行时覆盖了端口,但由于虚拟服务器位于固定端口(从application-test.yml
读取)而出现错误,有没有办法在运行时更改它以使服务器与随机端口匹配测试正在运行吗?
这是我的setup
函数:
`def setup()
omcService.soapClient = Stub(SOAPClient)
String url = "http://localhost:$port"
nonRetryableExceptionProcessor.omsUrl = url
omsService.omsUrl = url
omsService.authUrl = "$url/oauth/token?scope=all"
omsService = Spy(OmsService)
producerTemplate.start()
当我调试这个测试时,属性发生了变化,但是当应用程序执行 GET 操作时,它总是指向localhost:4321
,这不是 Spring 拾取的随机端口
【问题讨论】:
【参考方案1】:您可以在测试中注入随机端口。
例如使用@LocalManagementPort:
@LocalManagementPort
int port;
或者直接使用@Value:
@Value("$local.server.port")
int port;
但如果上述方法不起作用,那么我相信这是你最后的手段:
int port = context.embeddedServletContainer.port
注入后,您可以在该端口上对服务器执行 GET。
【讨论】:
我已经这样做了,实际上$port
变量是这样设置的,问题是,由于某种原因,应用程序测试从那个随机端口开始,我注入了那个随机端口以这种方式取值,但是当模拟的 GET 被调用时,它指向属性文件中的端口,而不是应用程序正在运行的端口
让我们尝试使用$randomServerPort
而不是$port
,其中带有注入端口的变量的randomServerPort名称。
需要完整的测试设置来了解它为什么不起作用。但是我们可以尝试另一种方法:让我们通过设置webEnvironment = WebEnvironment.DEFINED_PORT
在预定义的端口上开始。然后您的 application.yml 中的port
将在任何地方使用。
好的,我认为这可以帮助int port = context.embeddedServletContainer.port
而不是@Value("$local.server.port")
或@LocalManagementPort
。
在here 和here 之前似乎已经提出了类似的问题以上是关于如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?
使用 Spring Security Saml 和 SP 应用程序的无状态会话
如何使用千分尺指定我想在spring-boot中使用的指标的白名单