Spring 3,在服务调用测试中使用TransactionalTemplate?

时间:2012-07-11 15:47:10

标签: spring unit-testing transactions

我无法使用相当简单的测试方案。逻辑上(对我来说)它应该,但它不是

我有一个交易服务:

@Transactional(propagation = Propagation.REQUIRED)
public void addCustomer(Customer newCustomer)  {
    customerDAO.insert(newCustomer);
}

因此,它设置为启动事务或重用现有事务。我在应用程序上下文中设置了tx:annotation-driven transaction-manager="transactionManager",因此Spring将此服务视为事务性的。

我有一个调用此代码的测试,工作正常。

但是我想要另一个测试来验证回滚。所以我创建了一个调用TranscationTemplate块的测试,例如:

   final int preCount = service.getCustomerCount();;

    TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
    transactionTemplate.execute(new TransactionCallback<Void>() {
        public Void doInTransaction(TransactionStatus status) {

                // adding another and rolling back
                Customer c = new Customer();
                                    .
                                    .
                  service.addCustomer(c);

                status.setRollbackOnly();
                throw new RuntimeException("rollback");

我认为这会回滚addCustomer服务调用,因为这个块和服务都应该(?)共享同一个事务。

但回滚永远不会发生

任何想法为什么?你能否分享程序化和声明性交易?

修改&GT; 目标数据库是H2。

Junit定义如下:

RunWith(SpringJUnit4ClassRunner.class)

ContextConfiguration(locations = {"/customer-application-context.xml"})

public class TestAddCustomer extends AbstractTransactionalJUnit4SpringContextTests 

事务管理器在类中自动装配。

0 个答案:

没有答案