在每个测试用例之后清除内存数据库

时间:2011-08-04 06:02:49

标签: java hsqldb in-memory-database

我正在使用hsqldb来测试Java中的一些数据访问层。我有一些像100这样的测试用例。我创建一个内存数据库,然后在表中插入一些值,以便在我的测试用例中我可以加载它,但问题是每个测试用例我需要清除内存数据库,只有值不是表。 / p>

是否可能,有一件事是我需要手动删除表中的行,还有其他一些我可以使用的东西。

由于

4 个答案:

答案 0 :(得分:4)

如果在单元测试中使用DbUnit,则可以指定DbUnit应在每次测试之前执行清理和插入操作,以确保在每次测试之前数据库的内容都处于有效状态。这可以通过类似于下面的方式完成:

@Before
public void setUp() throws Exception
{
    logger.info("Performing the setup of test {}", testName.getMethodName());
    IDatabaseConnection connection = null;
    try
    {
        connection = getConnection();
        IDataSet dataSet = getDataSet();
        //The following line cleans up all DbUnit recognized tables and inserts and test data before every test.
        DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
    }
    finally
    {
        // Closes the connection as the persistence layer gets it's connection from elsewhere
        connection.close();
    }
}

请注意,始终建议您使用@Before设置方法执行任何设置活动,而不是@After拆解方法。后者表示您正在测试的方法中创建新的数据库对象,恕我直言并不能轻易地将其用于可测试的行为。此外,如果您在测试后进行清理,以确保第二次测试正确运行,那么任何此类清理实际上都是第二次测试设置的一部分,而不是第一次测试的拆解。

使用DbUnit的替代方法是在@Before设置方法中启动新事务,并在@After拆解方法中将其回滚。这取决于您的数据访问层的编写方式。

如果您的数据访问层接受Connection个对象,那么您的安装例程应该创建它们,并关闭自动提交。此外,假设您的数据访问层不会调用Connection.commit。假设前一个,您可以在拆解方法中使用Connection.rollback()回滚事务。

关于事务控制,下面的代码片段演示了如何使用JPA执行此操作:

@Before
public void setUp() throws Exception
{
    logger.info("Performing the setup of test {}", testName.getMethodName());
    em = emf.createEntityManager();
    // Starts the transaction before every test
    em.getTransaction.begin();
}

@After
public void tearDown() throws Exception
{
    logger.info("Performing the teardown of test {}", testName.getMethodName());
    if (em != null)
    {
        // Rolls back the transaction after every test
        em.getTransaction().rollback();
        em.close();
    }
}

如果您已经编写过一个ORM框架,甚至是自定义持久层,也必须采用类似的方法。

答案 1 :(得分:2)

您可以使用HSQLDB transactions吗?

在每次测试之前,开始新的交易:

START TRANSACTION;

每次测试后,将其回滚:

ROLLBACK;

这也可以让你有一些永久数据。

答案 2 :(得分:0)

根据您的测试框架,可以在每次测试后执行删除调用。在Junit中,注释为@After,并且在每个[@Test]方法之后将运行带有此注释的方法。

答案 3 :(得分:0)

您必须对销毁数据库内存使用截断查询,否则此链接对您有所帮助。

http://wiki.apache.org/db-derby/InMemoryBackEndPrimer