Как переопределить свойства приложения Spring в тестовых классах?Spring @ContextConfiguration разрывается при использовании внутренних классов Kotlin - PullRequest
0 голосов
/ 19 декабря 2018

В настоящее время я пытаюсь изменить некоторые свойства конфигурации 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?

...