使用REQUIRES_NEW对事务方法进行单元测试并始终强制回滚

时间:2014-02-28 11:02:10

标签: spring jpa junit spring-transactions

我想测试一个通过在循环中调用DAO将数据插入表中的服务方法。 service-method用

注释
@Transactional(propagation = Propagation.REQUIRES_NEW)

单元测试调用service-method并使用

进行注释
@Transactional

现在我想告诉事务它总是应该在最后做回滚。我不想在测试后手动清理数据库。

@Rollback和EntityManager.getTransaction()。setRollbackOnly()不起作用。我认为原因是注释和setRollbackOnly()仅应用于test-method创建的Transaction,而不应用于service-method创建的事务。

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您使用允许设置UserTransaction的PlatformTransactionManager实现(如org.springframework.transaction.jta.JtaTransactionManager),您可以实例化一个UserTransaction实现,其中commit方法执行回滚。

import com.atomikos.icatch.jta.UserTransactionImp;

@Bean
public UserTransaction myUserTransaction() {
    final UserTransactionImp userTransactionImp = new UserTransactionImp() {            

        @Override
        public void commit() throws javax.transaction.RollbackException, javax.transaction.HeuristicMixedException,
                javax.transaction.HeuristicRollbackException, javax.transaction.SystemException, java.lang.IllegalStateException,
                java.lang.SecurityException {
            rollback();
        }
    };

    return userTransactionImp;
}

然后,在您的PlatformTransactionManager bean中:

@Bean
public PlatformTransactionManager transactionManager(
        @Qualifier("myUserTransaction") UserTransaction myUserTransaction,
        @Qualifier("myTransactionManager") TransactionManager myTransactionManager
) {

    final JtaTransactionManager jtaTm = new JtaTransactionManager();

    jtaTm.setTransactionManager(myTransactionManager);
    jtaTm.setUserTransaction(myUserTransaction);

    return jtaTm;
}

我也让我的dao没有冲洗。