在单个事务下包装整个DBUnit / JUnit Test

时间:2012-06-18 18:11:59

标签: java junit dbunit

我已经四处寻找,但未能成功确定以下方法是否可行/良好做法。基本上我想做的是以下内容:

创建使用DBUnit初始化数据的JUnit测试。运行多个测试方法,每个测试方法都使用相同的初始数据集。在每个测试方法之后回滚到初始setUp函数之后的状态。在所有测试方法运行后,回滚在setUp函数中进行的任何更改。此时,数据库中的数据应与运行JUnit测试类之前的数据完全相同。

理想情况下,我不必在每个测试用例之前重新初始化数据,因为我可以在setUp之后立即回滚到该状态。

我已经能够回滚单个测试方法,但在所有测试方法运行后都无法回滚在setUp中所做的更改。

注意:我知道DBUnit的不同功能,例如CLEAN_INSERT,DELETE等。我使用Spring框架来注入我的dataSource。

示例布局如下:

public class TestClass {

    public void setUp() {
        // Calls a method in a different class which uses DBUnit to initialize the database
    }

    public void runTest1() {
        // Runs a test which may insert / delete data in the database
        // After running the test the database is in the same state as it was
        // after running setUp
    }

    public void runTest2() {
        // Runs a test which may insert / delete data in the database
        // After running the test the database is in the same state as it was
        // after running setUp
    }

    // After runTest1 and runTest2 have finished the database will be rolled back to the
    // state before any of the methods above had run.
    // The data will be unchanged as if this class had never even been run
}

我会在开发数据库中运行测试但是我宁愿不影响数据库中当前的任何数据。我可以在开始时运行CLEAN_INSERT以初始化数据,但是在所有测试方法运行之后,我希望数据恢复到我运行JUnit测试之前的状态。

提前致谢

2 个答案:

答案 0 :(得分:1)


我们在oVirt开源项目中解决了类似的问题。请查看驻留在engine \ backend \ manager \ modules \ dal \ src \ test \ java \ org \ ovirt \ engine \ core \ dao \ BaseDAOTestCase.java中的代码。
一般来看看我们在@BeforeClass和@AfterClass方法中所做的事情。您可以按方法使用它。我们使用了Spring-test框架。

答案 1 :(得分:1)

就像“setUp”一样,JUnit提供了在每个测试方法之后执行的“tearDown”方法。你可以用来回滚。同样从JUnit 4开始,您有以下注释:

  • @BeforeClass:在测试用例中运行任何测试之前运行一次
  • @Before:每次在测试方法之前运行
  • @After:每次测试方法后运行
  • @AfterClass:在执行当前套件中的所有测试后运行一次