Spring 引导 - 如何通过实现 BeforeAllCallback 的自定义扩展 class 设置或覆盖 application.yml 中定义的属性?

Spring Boot - How to set or override properties defined in application.yml via a custom extension class that implements BeforeAllCallback?

我有一个扩展 class 实现了 BeforeAllCallback 来设置这样的随机端口。

import org.junit.jupiter.api.extension.ExtensionContext
import java.net.ServerSocket

class CustomExtension : org.junit.jupiter.api.extension.BeforeAllCallback {
    var port: Int? = null

    override fun beforeAll(context: ExtensionContext?) {
        port = getRandomPort()
    }
    
    private fun getRandomPort(): Int {
        ServerSocket(0).use { 
            serverSocket -> return serverSocket.localPort 
        }
    }

}

此外,我在 src/test/resources/application.yml 中定义了一个 属性,就像这样。

app:
  random-port: 8765

这个属性被这个配置class使用了。

import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConstructorBinding

@ConstructorBinding
@ConfigurationProperties(prefix = "app")
data class PortProperty(
    val randomPort: Int
)

问题

当 运行 我的测试来自 CustomExtension class 时,如何覆盖硬编码 app.random-port?这个想法是为了让我的 PortProperty 获得正确的值而不是硬编码的值。

我的测试框架是JUnit5.

import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest
@ExtendWith(CustomExtension::class)
class RandomPortTest {
}

编辑

用例实际上是使用 AWS DynamoDBLocal 库启动本地 dynamo 数据库进行测试 classes.

可以在beforeAll方法中设置app.random-port系统属性。由于系统属性比属性文件具有 higher priority,因此来自 application.yml 的端口值将被覆盖:

override fun beforeAll(context: ExtensionContext?) {
    port = getRandomPort()
    System.setProperty("app.random-port", port?.toString())
}