В настоящее время я пытаюсь изменить некоторые свойства конфигурации 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)
}
}
(я использую здесь тестконтейнеры ...как заставить это работать, может быть отдельным вопросом, не стесняйтесь помогать мне. 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 101 * не можетобрабатывать внутренние классы Kotlin.Если я удалю ключевое слово inner
из своего внутреннего класса, 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?