使用Spring测试在测试中回滚事务

时间:2015-04-13 16:35:52

标签: spring testing

如果我在测试中抛出异常,我试图理解为什么我无法回滚事务?

我使用的是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");
    }
}

1 个答案:

答案 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注释在类或方法级别为您的   测试