我无法获得一个非常简单的测试场景来工作。逻辑上(对我来说)它应该,但它没有
我有交易服务:
@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 在类中自动装配。