如何在课后回滚事务(使用TestNg和Spring)?

时间:2014-05-13 07:19:20

标签: java spring transactions testng

假设我们有下一个测试:

@ContextConfiguration(classes = {MyDaoContext.class})
public class MyDaoTest extends AbstractTransactionalTestNGSpringContextTests {

@Autowired
private MyDao dao;

@Test
public void insertDataTest() {
    // insert data here and test something
}

@Test(dependsOnMethods = "insertDataTest")
public void modifyPreviouslyInsertedDataTest() {
    // get previously inserted data and test something
}
}

第二次测试将会失败,因为当我们完成第一次测试时,插入的数据就消失了。 在所有测试完成后,有没有办法回滚事务?

2 个答案:

答案 0 :(得分:3)

每个测试都在自己的事务中运行,并在最后进行回滚。您可以通过在第一次测试中添加@Rollback(false)来调整它。

现在的问题是insertDataTest的交易已经完成,因此您应该删除它手动创建的内容。为此,您扩展的类具有多种实用方法,例如deleteFromTablesdeleteFromTableWhere

理想情况下,这应该是@AfterClass或其他内容。

但那不是我会做的。我会将insertDataTest中插入的数据分解为共享实用程序。这样,您可以在第二次测试中再次调用它并删除dependsOnMethods。建议不要使用此依赖项,因为您无法单独运行该测试。

答案 1 :(得分:2)

尝试以下(在JUnit中可以使用,我对TestBG不确定)

@ContextConfiguration(classes = {MyDaoContext.class})
public class MyDaoTest extends AbstractTransactionalTestNGSpringContextTests {

   @Autowired
   private MyDao dao;

   @Test
   @Rollback(false)
   public void insertDataTest() {
       // insert data here and test something
   }

   @Test(dependsOnMethods = "insertDataTest")
   public void modifyPreviouslyInsertedDataTest() {
       // get previously inserted data and test something
   }
}

在这种情况下,您当然必须手动删除第一种方法中的数据