【问题标题】:Jpa testing and automatic rollback with Spring使用 Spring 进行 Jpa 测试和自动回滚
【发布时间】:2012-07-04 12:46:14
【问题描述】:

我指的是 Spring Roo In Action(Manning 的书)。书中某处说“Roo 将测试类标记为@Transactional,以便单元测试自动回滚任何更改

下面是说明方法:

@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 发生,这个方法的更改会自动回滚......

【问题讨论】:

    标签: spring testing jpa-2.0 rollback transactional


    【解决方案1】:

    引用documentation:

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

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

    【讨论】:

    【解决方案2】:

    我正在尝试找到一种方法,当列表中的一个元素由于已建立的业务规则内的原因(即:抛出我的自定义异常时)失败时,我可以进行回滚

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

    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..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 2018-05-25
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多