如何在 Micronaut/Kotest/Hibernate 测试中“获取当前线程的事务同步会话”

问题描述

我正在尝试在每次测试后清理我的组件测试使用的数据库,以便下一次它是空白的。为此,我有如下内容:

@MicronautTest
class ExampleTest(
    private val entityManager: EntityManager
) : BehaviorSpec() {

    override fun afterEach(testCase: TestCase,result: TestResult) {
        entityManager.transaction.begin()
        entityManager.createQuery("delete from DeviceEntity").executeUpdate()
        ementityManagertransaction.commit()
        entityManager.clear()
    }
    
    /* test code */
}

但是,当我运行它时,我收到以下错误:

Could not obtain transaction-synchronized Session for current thread
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at io.micronaut.transaction.hibernate5.MicronautSessionContext.currentSession(MicronautSessionContext.java:100)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:479)
    at io.micronaut.configuration.hibernate.jpa.TransactionalSessionInterceptor.intercept(TransactionalSessionInterceptor.java:56)
    at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:82)
    at io.micronaut.configuration.hibernate.jpa.TransactionalSession$Intercepted.unwrap(Unknown Source)
    at uk.arqit.cloud.device.core.service.v1.services.component.example.ExampeTest.afterEach(IncrementRatchetSuccessTest.kt:56)
...

我在其他帖子中看到提到使用 @Transaction 来装饰方法或从会话工厂获取实体管理器,但使用这些时错误是相同的。

在我的测试(即测试代码所在的位置)的 init { ... } 子句中运行此代码没有问题,并且它完全按预期工作。但是,如果我在 afterEach 中运行它,则会出现问题。

谁能就如何解决这个问题提供一些建议?

谢谢!

解决方法

找到解决方法,先在构造函数中添加SessionFactory

@MicronautTest
class ExampleTest(
    private val entityManager: EntityManager,private val sessionFactory: SessionFactory
) : BehaviorSpec() {
    
    afterEach(...) {
        ...
    }
}

afterEach 方法中有以下内容:

    override fun afterEach(testCase: TestCase,result: TestResult) {
        val sesh = sessionFactory.openSession()
        val em = sesh.entityManagerFactory.createEntityManager()

        /* do whatever you want with 'em' */
    }

值得一提的是,您还可以在类主体中声明 seshem,以便所有方法都可以访问它们

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...