Weld and junit,没有交易经理

问题描述 投票:0回答:1

我有一些junit风格的集成测试,其中注入由Weld处理。当我的被测代码对我的entityManager进行某些操作时,我能够注入一个entityManager,并且一切似乎都很好……除了实际上什么都没有写到内存H2数据库中……没有插入,更新任何东西。这是由于我无法告知任何事务。当我启动测试时,日志会通知我:

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

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

transactions integration-testing h2 junit4 weld
1个回答
1
投票

如果UserTransaction不可用,则很可能意味着您尚未配置事务管理器。 @Transactional@Inject UserTransaction功能在JTA规范中定义,该规范由事务管理器实现。

The 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

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

[如果遇到将事务管理器依赖项拖到项目中的问题-我知道可能会担心将依赖项列表扩大到更大范围,或者担心会对性能产生一些影响(即使我认为这种担心是毫无根据的,但这是不同的讨论)-那么您将需要配置EntityManager以与本地事务一起运行。使用<non-jta-data-source>可能会有所帮助。Hibernate需要在事务内部运行插入查询。这是先决条件。

请注意,如果将EntityManager配置为使用资源本地事务,则测试可以开始工作,但由于事务管理器提供的功能,因此您仍然不能使用@Inject UserTransaction@Transactional

© www.soinside.com 2019 - 2024. All rights reserved.