- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试更改测试代码中的一些 Spring 配置属性(它们不是静态的,这就是原因)。当我尝试用 @ContextConfiguration(initializers = [MyTestClass.Initializer::class])
解决我的问题时,出现了一件奇怪的事情.
并在MyTestClass
我这样定义:
inner class Initializer : ApplicationContextInitializer<ConfigurableApplicationContext> {
override fun initialize(applicationContext: ConfigurableApplicationContext) {
val values = TestPropertyValues.of("spring.datasource.url=" + postgresqlContainer.jdbcUrl)
values.applyTo(applicationContext)
}
}
(我在这里使用 Testcontainers ......如何让它工作可能是一个单独的问题,请随时帮助我。) postgresqlContainer
是 MyTestClass
的成员我想访问。当我运行测试时,我得到一个错误:
Caused by: java.lang.IllegalArgumentException: No argument provided for a required parameter: instance of fun com.example.MyTestClass.Initializer.<init>(): com.example.MyTestClass.Initializer
嗯,好的,所以我继续调试了一下,我认为是 Spring 的 BeanUtils
无法处理 Kotlin 内部类。如果我删除 inner
来 self 的内部类 BeanUtils 的关键字可以创建一个实例——当然对我没有帮助,因为我需要访问外部类的属性。
我写了一个小测试来证明我的怀疑:
import io.kotlintest.specs.StringSpec
import org.springframework.beans.BeanUtils
class Thing {
inner class InnerThing {
}
}
class BeanUtilTest: StringSpec({
"instantiate inner class" {
BeanUtils.instantiateClass(Thing.InnerThing::class.java)
// fails :-(
}
})
问题:有解决方法吗?如何在 Kotlin 测试中覆盖应用程序属性?
最佳答案
我刚遇到这个问题,经过很长时间试图弄清楚发生了什么,我终于想出了一个解决方案。
您可以按如下方式使用伴生对象(例如,对于 MySql):
@Testcontainers
@ExtendWith(SpringExtension::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(initializers = [ExampleIntegrationTest.Companion.Initializer::class])
class ExampleIntegrationTest {
companion object {
@Container
@JvmField
val mySqlContainer = KotlinMySqlContainer()
class Initializer : ApplicationContextInitializer<ConfigurableApplicationContext> {
override fun initialize(configurableApplicationContext: ConfigurableApplicationContext) {
TestPropertyValues.of(
"spring.datasource.url=" + mySqlContainer.jdbcUrl,
"spring.datasource.username=" + mySqlContainer.username,
"spring.datasource.password=" + mySqlContainer.password
).applyTo(configurableApplicationContext.environment)
}
}
}
...
}
关于spring-boot - 如何覆盖测试类中的 spring 应用程序属性?使用 Kotlin 内部类时 Spring 的 @ContextConfiguration 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854572/
我是一名优秀的程序员,十分优秀!