如何在每次testing后从我的HSQLDB中擦除数据?

我有一些JUnittesting已经写在我的项目中,用来填充设置方法中的数据。 现在我已经添加了maven到我的项目中,我想执行所有的testing用例,例如使用mvntesting。 现在的问题是,我的数据库不会在每个testing类运行后被清除。 每个类的testing用例都运行后,我需要清除HSQLDB。

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

    DROP SCHEMA PUBLIC CASCADE

  2. 或者,如果需要表和模式对象定义,则可以创build包含对象但不包含数据的文件:数据库,并将以下属性添加到.properties文件。 使用这种types的数据库进行testing,数据的更改不会持久

    files_read_only =真

  3. HSQLDB 2.2.6及更高版本中提供的最新备选scheme允许您在保留表格的同时清除模式中的所有数据。 在下面的例子中,PUBLIC模式被清除。

    TRUNCATE SCHEMA公开和提交

    这个声明在HSQLDB的最新版本中得到了增强。 在截断语句下查看http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

根据fredt的build议, TRUNCATE SCHEMA公共重新启动 身份 和提交没有CHECK为我工作。 DAO的JUnittesting中的相关代码部分。

@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上的文档;

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

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

即使你不使用Spring,你也可以自己try {} finally {}块,以便为每个testing回滚已启动的事务。

另一个解决scheme列在“清除testing之间的数据库” http://www.objectpartners.com/2010/11/09/unit-testing-your-persistence-tier-code/

我有一个简单的SQL脚本,在每个testing之前运行,在开始时使用以下语句:

 TRUNCATE SCHEMA public AND COMMIT; 

但我遇到了testing之间的locking问题,并添加这对我的工作就像一个魅力:

 @After public void after() throws Exception { if (entityManager.getTransaction().isActive()) { entityManager.getTransaction().rollback(); } }