【问题标题】:How to change server port in runtime with a spring boot application and spock testing如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口
【发布时间】: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 拾取的随机端口

【问题讨论】:

    标签: java spring-boot groovy spock


    【解决方案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
    • herehere 之前似乎已经提出了类似的问题
    猜你喜欢
    • 2019-01-27
    • 2019-03-05
    • 2014-08-29
    • 1970-01-01
    • 2020-11-13
    • 2020-01-27
    • 2019-04-30
    • 2018-04-22
    • 2018-01-20
    相关资源
    最近更新 更多