Kotlin – Как управлять статическим методом @BeforeClass в springBootTest

Я хочу иметь метод @BeforeClass в моем springBootTest, который должен быть статическим и объявленным в «сопутствующем объекте».

@RunWith(SpringRunner::class)
@SpringBootTest
@ActiveProfiles("test")
open class MyTest {
companion object {

    @Autowired
    lateinit var repo: MyRepository

    @BeforeClass
    @JvmStatic
    fun X() {
        user = User()
        repo.save(user)
    }

}

С другой стороны, я должен использовать некоторые компоненты Autowired в этом методе, но, как уже упоминалось, использование-an-autowired-spring-bean/50090579">здесь невозможно в статическом контексте, и я получил эту ошибку:

lateinit property repo has not been initialized

Любое предложение о том, как мне справиться с этой ситуацией?


person Mhy    schedule 31.07.2018    source источник
comment
Autowire вообще не может автоматически связывать статические поля. Настройте свое репо перед каждым тестом, а не перед тем, как класс станет вашим единственным реальным вариантом.   -  person Darren Forsythe    schedule 31.07.2018


Ответы (2)


Я предлагаю вам перейти на Junit 5. Он позволяет использовать @BeforeAll в обычных нестатических методах. Кроме того, если вы используете Junit 5 Spring Extension, вы сможете внедрить зависимости в файл @BeforeAll.

Способ обновления версии JUnit будет зависеть от того, какой инструмент сборки вы используете (Maven или Gradle). Также вам нужно заменить @RunWith(SpringRunner::class) на @ExtendWith(SpringExtension::class).

Вам также потребуется создать файл свойств src/test/resources/junit-platform.properties с содержимым: junit.jupiter.testinstance.lifecycle.default = per_class. Благодаря этому вы сможете использовать вас для использования @BeforeAll в нестатических методах.

Может показаться, что это много, но JUnit 5 лучше подходит, если вы используете Kotlin и Spring Boot.

Ссылка: Тестирование с помощью JUnit 5 в разделе Создание веб-приложений с Spring Boot и Kotlin

person Fabricio Lemos    schedule 01.08.2018
comment
Спасибо. Я попробовал ваше решение. Компоненты Autowire не инициализируются, когда я заменяю @RunWith(SpringRunner::class) на @ExtendWith(SpringExtension::class). Есть идеи? Другая проблема заключается в том, что метод @BeforeAll не вызывается! Я использую Мавен. Я попробовал этот ответ, но все равно не повезло. - person Mhy; 04.08.2018
comment
Пожалуйста, опубликуйте новый код, это поможет лучше проанализировать проблему. Вы можете увидеть рабочий пример автоматического связывания компонентов здесь: github.com/fabriciolemos/kotlin-spring-boot-lab/blob/master/src/ - person Fabricio Lemos; 07.08.2018
comment
проблема заключалась в зависимости spring-boot-starter-test в моем pom.xml, который использует junit4 (если вы не исключите его). Я исключил junit из spring-boot-starter-test в pom, и теперь все работает нормально. - person Mhy; 12.08.2018

Если вы не хотите обновляться до JUnit5, вы можете использовать @PostConstruct, это будет иметь тот же эффект. Пример здесь

person sergiofbsilva    schedule 08.11.2019