首页 > 解决方案 > 如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口

问题描述

我正在使用 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:4321always,这不是 Spring 拾取的随机端口

标签: javaspring-bootgroovyspock

解决方案


您可以将随机端口注入您的测试。

例如使用@LocalManagementPort

    @LocalManagementPort
    int port;

或者直接使用@Value:

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

但如果上述方法不起作用,那么我相信这是你最后的手段:

    int port = context.embeddedServletContainer.port

注入后,您可以在该端口上对服务器执行 GET。


推荐阅读