現在、テスト コードでいくつかの 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
そうですね、少しデバッグを続けましたが、BeanUtils
Kotlin の内部クラスを処理できないのは Spring だと思います。内部クラス BeanUtils からキーワードを削除するとinner
、インスタンスを作成できますが、外部クラスのプロパティにアクセスする必要があるため、もちろん役に立ちません。
私は私の疑いを主張するために小さなテストを書きました:
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 でテスト内のアプリケーション プロパティをオーバーライドするにはどうすればよいですか?