0

我无法让 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)

测试用例使用 Spring 的SpringExtension 连接到 JUnit 5 引擎。它还使用来自KotlintestSpringListener的and来构建测试并进行断言。Wordspec

正确地SpringListener自动装配依赖关系,但不知何故没有创建事务。

运行测试用例会给出以下堆栈跟踪:

2018-10-12 10:54:14.329 INFO 59374 --- [intest-engine-0] com.example.demo.ShoppingOrderSpec:在 4.478 秒内启动 ShoppingOrderSpec(JVM 运行 7.421)org.hibernate.LazyInitializationException:懒惰失败初始化角色集合:com.example.demo.ShoppingOrder.lines,无法初始化代理 - org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:582) 处没有会话 ...在 com.example。 demo.ShoppingOrderSpec$1$1.invoke(ShoppingOrderSpec.kt:35) at com.example.demo.ShoppingOrderSpec$1$1.invoke(ShoppingOrderSpec.kt:19)

所以,不知何故,org.springframework.transaction.annotation.Transactional注释似乎不起作用,因为删除注释,只是给出了相同的响应。

任何人有任何想法如何得到@Transactional应用和尊重?

4

1 回答 1

0

您不能将 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是一个 Jupiter 特定的注释,告诉它使用SpringExtension该类。KotlinTest 等效项是SpringListener您已经连接的。

我不确定@SpringBootTest春天是否会被接走。可能需要为此添加支持,具体取决于它的作用。

最后,@Transactional 通过在方法上创建代理来工作,但由于在更高级的测试框架(如 KotlinTest)中,测试容器不是方法,而只是任意函数,因此无法拦截。

我认为在这种情况下,您可能需要创建一个适当的方法并对其进行注释,或者尝试使用AnnotationSpec而不是StringSpec您正在使用的任何其他规范基类,它使用您可以注释的实际方法。

于 2018-10-12T11:40:02.767 回答