Котлинтест с Spring Test, @Transactional не работает / не применяется - PullRequest
0 голосов
/ 12 октября 2018

У меня проблема с тем, чтобы Spring Boot 2.0.5 хорошо работал с Kotlintest 3.1.10.

Я сделал тестовый проект , иллюстрирующий мою проблему.Проект представляет собой Spring Boot 2 приложение с двумя сущностями, ShoppingOrder и OrderLine (чтобы быть полностью невообразимым).

Существует также тестовый пример ShoppingOrderSpec, который просто проверяет сопоставление, сохраняя и получая Заказ.

Тестовый случай настроен следующим образом:

@ExtendWith(SpringExtension::class)
@Transactional
@SpringBootTest
class ShoppingOrderSpec : WordSpec() {
    override fun listeners() = listOf(SpringListener)

тестовый пример использует SpringExtension от Spring для подключения к движку JUnit 5.Он также использует SpringListener и Wordspec из Kotlintest для структурирования тестов и выполнения утверждений.

SpringListener правильно автоматически связывает зависимости, но каким-то образом транзакция не выполняетсясоздал.

Запуск тестового примера дает следующую трассировку стека:

2018-10-12 10: 54: 14.329 INFO 59374 --- [intest-engine-0] com.example.demo.ShoppingOrderSpec: Запустил ShoppingOrderSpec за 4.478 секунды (JVM работает для 7.421) org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию ролей: com.example.demo.ShoppingOrder.lines, не удалось инициализировать прокси - нет Session at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException (AbstractPersistentCollection.java:582) ... в com.example.demo.ShoppingOrderSpec $ 1 $ 1.invoke (ShoppingOrderSpec.kt: 35) в com.example.demo.Shopping $(ShoppingOrderSpec.kt: 19)

Итак, почему-то аннотация org.springframework.transaction.annotation.Transactional не работает, как удалениеаннотация, просто дает тот же ответ.

Кто-нибудь есть идеи, как применить и уважать @Transactional?

1 Ответ

0 голосов
/ 12 октября 2018

Вы не можете использовать расширения JUnit Jupiter с KotlinTest, так как это разные движки.Junit Jupiter - это реализация поверх Junit Platform, как и KotlinTest, но все, что написано специально для Jupiter, не будет работать с KotlinTest.Однако все, что написано для Junit Platform, должно работать.

К сожалению, выбор команды имен JUnit неудачен, поэтому люди думают, что JUnit Jupiter - это то же самое, что и JUnit Platform.

В любом случае, эти

@ExtendWith(SpringExtension::class)
@Transactional
@SpringBootTest

расширения не будут ничего значить для KotlinTest, больше, чем для Spek или чего-либо еще.ExtendWith является специфической для Юпитера аннотацией, которая говорит ему использовать класс SpringExtension.Эквивалент KotlinTest - это SpringListener, который вы уже подключили.

Я не уверен, будет ли @SpringBootTest получен Spring или нет.Для этого может потребоваться поддержка, в зависимости от того, что он делает.

Наконец, @Transactional работает, создавая прокси для методов, но, поскольку в более продвинутых средах тестирования, таких как KotlinTest, тестовые контейнеры являются не методами, а простопроизвольные функции, он не сможет перехватить.

Я думаю, в этом случае вам может понадобиться создать правильный метод и аннотировать его, или попытаться использовать AnnotationSpec вместо StringSpec или любой другой используемый вами базовый класс спецификации, который использует реальные методы, которые вы можете аннотировать.

...