3

現在、テスト コードでいくつかの 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

そうですね、少しデバッグを続けましたが、BeanUtilsKotlin の内部クラスを処理できないのは 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 でテスト内のアプリケーション プロパティをオーバーライドするにはどうすればよいですか?

4

1 に答える 1

1

私はちょうどこれに遭遇し、長い間何が起こっているのかを理解しようとした後、最終的に解決策を思いついた.

次のようにコンパニオン オブジェクトを使用できます (たとえば、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)
            }
        }
    }
    ...
}
于 2019-10-08T03:21:44.150 に答える