如何使用 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 Boot 和 SAML 2.0

使用 Spring Security Saml 和 SP 应用程序的无状态会话

如何使用千分尺指定我想在spring-boot中使用的指标的白名单

Spring Boot 自动配置之@Conditional的使用

关于如何使用 jpa-repositiroies 在 Spring-Boot 上持久保存数据的指南/教程