焊接和junit,没有事务管理器

Weld and junit, no transactionmanager

我有一些 junit 风格的集成测试,其中注入由 Weld 处理。我能够很好地注入一个 entityManager,并且一切似乎都很好,当我的测试代码对我的 entityManager 执行一些操作时......除了实际上没有任何内容写入我的内存 H2 数据库......没有插入,更新任何事物。据我所知,这是由于没有任何交易可用造成的。当我启动测试时,日志会提示我:

交易服务不可用。 @Inject UserTransaction 注入不可用。事务观察者将被同步调用。

有什么normal/typical方法可以做到这一点吗?我只发现了这个:https://in.relation.to/2019/01/23/testing-cdi-beans-and-persistence-layer-under-java-se/ 这有点接近我需要的(我在正在测试的代码中使用 @Transactional 注释)但似乎必须重新发明 weel。真的没有简单的方法吗?

如果 UserTransaction 不可用,这很可能意味着您还没有配置事务管理器。 @Transactional@Inject UserTransaction 功能在由事务管理器实现的 JTA 规范中定义。

Weld 在 WildFly 中使用,并与 Narayana 很好地集成。这是您的一种选择(免责声明:我是 http://narayana.io 项目的开发人员)。

当您的应用程序 运行 处于独立模式时,您需要在上面提供一些集成。起点是添加对

的依赖
<groupId>org.jboss.narayana.jta</groupId>
<artifactId>cdi</artifactId>

然后您应该在其上实现 Weld SPI 接口(示例在此处的 Narayana 快速入门中:https://github.com/jbosstm/quickstart/blob/master/jta-1_2-standalone/src/test/java/org/jboss/narayana/quickstarts/jta/cdi/CDITransactionServices.java

我写了一篇关于此的博客 post,您可以在此处找到更多详细信息:http://jbossts.blogspot.com/2019/04/jta-and-cdi-integration.html

如果您在将事务管理器依赖项拉入您的项目时遇到问题 - 我知道可能会担心扩展依赖项列表或对某些性能影响(即使我认为这种担心毫无根据,但它是不同的讨论) - 然后你需要使用本地事务将你的 EntityManager 配置为 运行。使用 <non-jta-data-source> 可能会有所帮助。 Hibernate 需要 运行 事务内的插入查询。这是先决条件。

请注意,如果您将 EntityManager 配置为使用资源本地事务,测试可能会开始工作,但您仍然不能使用 @Inject UserTransaction@Transactional,因为它们是提供的功能交易经理。