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

2022-08-31 20:47:23

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


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

    删除架构公共级联

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

    files_read_only=真

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

    截断架构公共并提交

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


答案 2

按照 fredt 的建议,截断架构公共重启标识并提交没有检查对我有用。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();
        }
    }
}

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

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


推荐