我想在预先存在的系统中使用arquillian,我正在创建第一个测试。 我调用DAO组件来设置测试数据,因此它尝试运行的第一个命令是:
DROP TABLE IF EXISTS ...
当代码执行
时query.executeUpdate()
命令,我得到了
javax.persistence.TransactionRequiredException:执行 更新/删除查询
这是我的测试:
@RunWith(Arquillian.class)
@Transactional
public class MyFirstIT {
// @Resource
// private UserTransaction utx;
@Before
public void setup() throws Exception {
// utx.begin();
}
@After
public void commitTransaction() throws Exception {
// utx.rollback();
}
@Inject
private MyDAO myDAO;
@Test
public void myTest() throws IOException, SolrServerException {
myDAO.setup();
}
/* @Deployment ignored for brevity */
}
我的DAO定义如下:
@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class MyDAO
我的依赖项:
<dependency>
<groupId>org.jboss.arquillian.extension</groupId>
<artifactId>arquillian-transaction-jta</artifactId>
<version>1.0.2.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.extension</groupId>
<artifactId>arquillian-persistence-impl</artifactId>
<version>1.0.0.Alpha6</version>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.junit</groupId>
<artifactId>arquillian-junit-container</artifactId>
<version>1.1.10.Final</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-arquillian-container-remote</artifactId>
<version>8.1.0.Final</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.shrinkwrap.resolver</groupId>
<artifactId>shrinkwrap-resolver-impl-maven</artifactId>
<version>2.2.0</version>
<scope>test</scope>
</dependency>
如您所见,我尝试使用arquillian-transaction-jta和@Transactional属性as described here
我也尝试创建自己的事务as described here,但没有工作,我收到相同的错误消息。
我认为问题在于DAO具有TransactionAttributeTyoe.SUPPORTS注释。有没有办法在调用DAO之前在测试中创建事务?
答案 0 :(得分:3)
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
这意味着事务将被传播但不会被创建。你应该在调用DAO方法之前启动一个。它可以是:
@RunWith(Arquillian.class)
public class MyFirstIT {
@Inject
private UserTransaction userTransaction;
@Test
public void myTest() throws IOException, SolrServerException {
userTransaction.begin();
myDAO.setup();
userTransaction.commit();
}
}
或者你可以切换到
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
在容器内启动新事务。或者使用:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
只有在它没有来的时候才会创造。对于@Stateless bean,后一个是默认值(所以你可以完全避免使用注释),在大多数情况下,我说这是可取的方式