如果我在测试中抛出异常,我试图理解为什么我无法回滚事务?
我使用的是Spring 4.1.5,而我正试图测试我的交易。 我已经注释了@Transactional我的存储库和事务 如果存储库抛出异常,则回滚。我也注释了 @Transactional我的测试方法并调用了几个方法 存储库在一个事务中工作。 但是,当我自己在测试中输出异常时,事务不会回滚。为什么? 看起来它是出于某种目的而做的还是我做错了什么?
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@ContextHierarchy({
@ContextConfiguration(locations = {
"classpath:/META-INF/spring/jpa-persistence-context.xml"})
})
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = RuntimeException.class)
public class FeaturedGroupRepositoryTest2 {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = RuntimeException.class)
@Test
public void testFeaturedGroupDao() {
FeaturedGroupEntity newFeaturedGroupEntity = new FeaturedGroupEntity();
FeaturedGroupEntity savedFeaturedGroupEntity = featuredGroupRepository.save(newFeaturedGroupEntity);
FeaturedGroupEntity foundFeaturedGroupEntity = featuredGroupRepository.findOne(savedFeaturedGroupEntity.getId());
throw new RuntimeException("test rollback");
}
}
答案 0 :(得分:1)
@Kieren Dixon在How to rollback a database transaction when testing services with Spring in JUnit?中遇到的问题可能是你在Junit类上缺少TransactionalTestExecutionListener注释:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
@TestExecutionListeners({TransactionalTestExecutionListener.class})
public class WorkUnitRepoTest {
@Inject MyRepo repo;
@Test
public void test() {
repo.delete(1);
}
}
即使Spring documentation for 4.1.7提到默认情况下监听器处于活动状态,我也必须手动添加它才能工作。但是,在类或方法级别上始终需要@Transactional才能使其工作。
摘录Spring Framework 4.1.7.RELEASE:
在TestContext框架中,事务由管理 TransactionalTestExecutionListener,默认配置, 即使你没有明确声明你的@TestExecutionListeners 考试班。但是,要启用对事务的支持,您必须这样做 在ApplicationContext中配置PlatformTransactionManager bean 通过@ContextConfiguration语义加载(更多细节 在下面提供)。另外,你必须声明Spring的 @Transactional注释在类或方法级别为您的 测试