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

Java 在每个测试用例之后清除内存中的数据库,java,hsqldb,in-memory-database,Java,Hsqldb,In Memory Database,我正在使用hsqldb测试Java中的一些数据访问层。我有一些测试用例,比如100个左右。我创建了一个内存数据库,然后在表中插入一些值,这样我就可以用我的测试用例加载它,但问题是对于每个测试用例,我都需要清除内存数据库,只清除值而不是表 有没有可能,一件事是我需要手动删除表中的行,还有什么我可以使用的呢 谢谢根据您的测试框架,可以在每次测试后执行删除调用。在Junit中,注释为,并且带有此注释的方法将在每个[]方法之后运行。您可以使用吗 在每次测试之前,启动一个新事务: START TRANSA

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

有没有可能,一件事是我需要手动删除表中的行,还有什么我可以使用的呢


谢谢

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

您可以使用吗

在每次测试之前,启动一个新事务:

START TRANSACTION;
每次测试后,将其回滚:

ROLLBACK;

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

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

如果在单元测试中使用,则可以指定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
设置方法中执行任何设置活动,而不是在
@Before
拆卸方法中执行任何设置活动。后者表示您正在测试的方法中创建新的数据库对象,而IMHO并不容易使其产生可测试的行为。此外,如果您在测试后进行清理,以确保第二个测试正确运行,那么任何此类清理实际上都是第二个测试设置的一部分,而不是第一个测试的拆卸

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

如果您的数据访问层接受
连接
对象,那么您的设置例程应该创建它们,并关闭自动提交。另外,假设您的数据访问层不会调用
Connection.commit
。假设使用上一种方法,您可以在teardown方法中使用
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框架,那么其他ORM框架甚至您的自定义持久性层也必须采用类似的方法。

您使用的是Java测试框架吗?