如何在 SpringBootTest 中将@LocalPort 与@DynamicPropertySource 一起使用?

How to use @LocalPort together with @DynamicPropertySource in a SpringBootTest?

我们有以下配置

应用-local.yaml

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: http://localhost:8080/jwks

应用-production.yaml

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: https://auth.foo.com/.well-known/jwks.json

当 运行 在本地主机上时,我们有一个控制器可以模拟 OAuth2 端点并返回自签名令牌。

使用静态端口时一切正常。

我们在使用 WebEnvironment.RANDOM_PORT

时努力用 SpringBootTest 中的动态端口覆盖 属性 jwt-set-uri

根据文档 @DynmicPropertSource 应该是最合适的 但必须是静态的(意味着 Kotlin 中伴随对象的一部分)

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class Test {

@LocalServerPort
private var port = 0

 companion object {
        @DynamicPropertySource
        fun registerUrl(registry: DynamicPropertyRegistry) {
            registry.add("spring.security.oauth2.resourceserver.jwt.jwk-set-uri", "???")
        }
    }
}

我的问题: 我可能在这里遗漏了一些东西,但是如何在 @DynamicPropertySource 的静态上下文中访问非静态端口?

由于 @LocalServerPort 是 属性,您可以使用 @JvmStatic 对其进行注释。然后您就可以在 @DynamicPropertySource

中使用它