3

我正在使用 hsqldb 来测试 Java 中的一些数据访问层。我有一些测试用例,比如 100 个左右。我创建了一个内存数据库,然后在表中插入一些值,以便我可以使用我的测试用例加载它,但问题是对于每个测试用例我需要清除内存数据库,只有值而不是表。

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

谢谢

4

4 回答 4

4

如果您在单元测试中使用DbUnit,您可以指定 DbUnit 在每次测试之前都应该执行一个 clean-and-insert 操作,以确保数据库的内容在每次测试之前都处于有效状态。这可以通过类似于以下方式的方式完成:

@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 的替代方法是在 setup 方法中启动一个新事务,并在teardown 方法@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 框架甚至您的自定义持久层,则必须采用类似的方法。

于 2011-08-04T06:17:42.770 回答
2

你可以使用HSQLDB 事务吗?

在每次测试之前,开始一个新事务:

START TRANSACTION;

每次测试后,将其回滚:

ROLLBACK;

这也将允许您拥有一些永久数据。

于 2011-08-04T06:09:37.307 回答
0

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

于 2011-08-04T06:05:44.740 回答
0

您必须使用 Truncate Query 来销毁数据库内存,否则此链接可能对您有所帮助。

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

于 2011-08-04T06:11:26.657 回答