如何在每次testing后从我的HSQLDB中擦除数据?
我有一些JUnittesting已经写在我的项目中,用来填充设置方法中的数据。 现在我已经添加了maven到我的项目中,我想执行所有的testing用例,例如使用mvntesting。 现在的问题是,我的数据库不会在每个testing类运行后被清除。 每个类的testing用例都运行后,我需要清除HSQLDB。
-
您可以通过删除模式来清除数据。 默认模式称为PUBLIC。 如果您执行下面的SQL声明,它将清除所有数据并删除所有表。
DROP SCHEMA PUBLIC CASCADE
-
或者,如果需要表和模式对象定义,则可以创build包含对象但不包含数据的文件:数据库,并将以下属性添加到.properties文件。 使用这种types的数据库进行testing,数据的更改不会持久
files_read_only =真
-
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(); } }