我想测试一个通过在循环中调用DAO将数据插入表中的服务方法。 service-method用
注释@Transactional(propagation = Propagation.REQUIRES_NEW)
单元测试调用service-method并使用
进行注释@Transactional
现在我想告诉事务它总是应该在最后做回滚。我不想在测试后手动清理数据库。
@Rollback和EntityManager.getTransaction()。setRollbackOnly()不起作用。我认为原因是注释和setRollbackOnly()仅应用于test-method创建的Transaction,而不应用于service-method创建的事务。
有谁知道如何解决这个问题?
答案 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没有冲洗。