2012-07-04 43 views
1

我参考了Spring Roo In Action(来自Manning的书)。在某个地方它说这本书“袋鼠标记测试类为@Transactional,使单元测试自动回滚任何变化Jpa测试和Spring自动回滚

这里的描述方法:

@Test 
@Transactional 
    public void addAndFetchCourseViaRepo() { 
    Course c = new Course(); 
    c.setCourseType(CourseTypeEnum.CONTINUING_EDUCATION); 
    c.setName("Stand-up Comedy"); 
    c.setDescription(
     "You'll laugh, you'll cry, it will become a part of you."); 
    c.setMaxiumumCapacity(10); 

    c.persist(); 
    c.flush(); 
    c.clear(); 
    Assert.assertNotNull(c.getId()); 

    Course c2 = Course.findCourse(c.getId()); 
    Assert.assertNotNull(c2); 
    Assert.assertEquals(c.getName(), c2.getName()); 
    Assert.assertEquals(c2.getDescription(), c.getDescription()); 
    Assert.assertEquals(
     c.getMaxiumumCapacity(), c2.getMaxiumumCapacity()); 
    Assert.assertEquals(c.getCourseType(), c2.getCourseType()); 
    } 

不过,我不知道明白为什么这个方法的改变将没有发生的RuntimeException自动回滚...

回答

4

报价从documentation

默认情况下,框架将为每个测试创建并回滚事务。您只需编写可以假定交易存在的代码。另外,如果测试方法在事务中运行时删除选定表的内容,则事务将默认回滚,并且数据库将在执行测试之前返回到其状态。事务支持通过在测试的应用程序上下文中定义的PlatformTransactionManager bean提供给您的测试类。

因此,换句话说,运行测试的SpringJUnit4ClassRunner总是在测试执行后执行事务回滚。

+0

谢谢!换句话说'@RunWith(SpringJUnit4ClassRunner.class)'加'@ Transactional'加'@ Test'会自动回滚? – balteo

+1

是的。 (另一个证明链接:http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/test/context/transaction/TransactionalTestExecutionListener.html) –

0

我试图找到一种方法,让我当列表的元素之一失败的建立(即:把我的自定义异常时),在业务规则中的原因做了回滚

例,(如果列表中的一个元素失败,则该想法不会记录任何内容)

public class ControlSaveElement { 

public void saveRecords(List<MyRecord> listRecords) { 

    Boolean status = true; 

    foreach(MyRecord element: listRecords) { 
    // Here is business rules 
    if(element.getStatus() == false) { 
     // something 
     status = false; 
    } 
    element.persist(); 
    } 

    if(status == false) { 
    // I need to do roll back from all elements persisted before 
    } 
} 

... 
} 

任何想法?我正在使用Roo 1.2.2 ..

+0

问你自己的问题 – rptmat57