0

我无法获得一个非常简单的测试场景来工作。逻辑上(对我来说)它应该,但它没有

我有交易服务:

@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 服务调用,因为这个块和服务都应该(?)共享同一个事务。

但是回滚永远不会发生

任何人有任何想法为什么?您不能共享程序化和声明性事务吗?

编辑> 目标数据库是 H2。

Junit定义如下:

RunWith(SpringJUnit4ClassRunner.class)

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

public class TestAddCustomer extends AbstractTransactionalJUnit4SpringContextTests 

transactionManager 在类中自动装配。

4

0 回答 0