2

作为学习经验,我正在尝试将 Spring Boot 的 kotlin 教程 ( https://spring.io/guides/tutorials/spring-boot-kotlin/ ) 中描述的测试从使用 JUnit 5 移植到 KotlinTest。

在使用 注释的存储库测试中@DataJpaTest,我设法很好地自动装配我的 JPA 存储库。但是自动装配 Spring BootTestEntityManager不起作用,正如我java.lang.IllegalStateException: No transactional EntityManager found在测试中尝试使用它时所得到的那样。

除了@DataJpaTest,我尝试添加@Transactional,但没有运气。

使用 JUnit5 运行测试时,使用 entityManager 持久化实体可以正常工作。

@DataJpaTest
class RepositoriesTests @Autowired constructor(
        val entityManager: TestEntityManager,
        val userRepository: UserRepository,
        val articleRepository: ArticleRepository) {

    @Test
    fun `When findByIdOrNull then return article`() {
        val juergen = User(login = "springjuergen", firstname = "Juergen", lastname = "Hoeller")
        entityManager.persist(juergen) <--- OK

但是使用 KotlinTest,它失败了:

@DataJpaTest
class RepositoriesTests @Autowired constructor(
        val entityManager: TestEntityManager,
        val userRepository: UserRepository,
        val articleRepository: ArticleRepository) : StringSpec() {

    init {

        "When findByIdOrNull then return article" {
            val juergen = User(login = "springjuergen", firstname = "Juergen", lastname = "Hoeller")
            entityManager.persist(juergen) <--- FAIL

错误是java.lang.IllegalStateException: No transactional EntityManager found.

我一直无法弄清楚如何在使用 KotlinTest 实现的测试中提供这个实体管理器。

4

1 回答 1

0

只需创建事务包装器,如下所示:

@Component
class TransactionWrapperUtils {

    @Transactional
    public fun runWithTransaction(f: () -> Unit) {
        f()
    }
}

并称它为

transactionWrapperUtils.runWithTransaction { entityManager.persist(juergen) }
于 2021-06-30T08:58:05.567 回答