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())
}
我有一个扩展 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())
}