每次测试后如何从HSQLDB中擦除数据?

Rob*_*bin 46 java junit hibernate hsqldb

我已经在我的项目中编写了一些JUnit测试,用于在setup方法中填充数据.现在我已将maven添加到我的项目中,并且我希望从maven执行所有测试用例,即使用mvn test.现在的问题是我的数据库在每个测试类运行后都没有被清除.我需要在每个类的测试用例运行后清除HSQLDB.

fre*_*edt 81

  1. 您可以通过删除架构来清除数据.默认架构称为PUBLIC.如果您执行下面的SQL声明,它将清除所有数据并删除所有表.

    DROP SCHEMA PUBLIC CASCADE

  2. 或者,如果需要表和模式对象定义,则可以创建一个文件:包含对象但没有数据的数据库,并将下面的属性添加到.properties文件中.使用此类型的数据库进行测试,不会保留对数据的更改

    files_read_only =真

  3. HSQLDB 2.2.6及更高版本中提供的最新替代方案允许您在保留表的同时清除模式中的所有数据.在下面的示例中,将清除PUBLIC架构.

    TRUNCATE SCHEMA public AND COMMIT

    该语句在最新版本的HSQLDB中得到了增强.请参阅Truncate Statement下的http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

  • #3 对我来说非常有用。由于各种原因,我无法在测试方法之间回滚,因此我创建了一个 @@After @@Transactional 方法,该方法采用实体管理器并执行它。 (2认同)

use*_*188 19

根据弗雷特的建议,TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK 为我工作.DAO的JUnit测试中相关的代码部分.

@After
public void tearDown() {
    try {
        clearDatabase();
    } catch (Exception e) {
        fail(e.getMessage());
    }
}


public void clearDatabase() throws Exception {
  DataSource ds = (DataSource) SpringApplicationContext.getBean("mydataSource");
  Connection connection = null;
  try {
    connection = ds.getConnection();
    try {
      Statement stmt = connection.createStatement();
      try {
        stmt.execute("TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK");
        connection.commit();
      } finally {
        stmt.close();
      }
    } catch (SQLException e) {
        connection.rollback();
        throw new Exception(e);
    }
    } catch (SQLException e) {
        throw new Exception(e);
    } finally {
        if (connection != null) {
            connection.close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement上的文档

如果指定了RESTART IDENTITY,则架构中的所有表IDENTITY序列和所有SEQUENCE对象都将重置为其起始值


Cle*_*t P 9

我们在所有测试中所做的是在执行结束时(在所有断言完成之后)回滚事务.我们使用Spring,并且默认情况下的测试不会在最后提交.这可确保您始终返回到数据库的起始状态(在初始创建实体表和运行import.sql之后).

即使您不使用Spring,也可以使用自己的try {} finally {}块来回滚每个测试的已启动事务.

  • 如果您只测试单个事务,这是一个好主意.测试可能包含多个事务. (2认同)