在单元测试中最重要的就是要保持测试实例是独立的。因为该方法仍然涉及数据库,所以需要一种方法在每个测试实例之前清理数据库。在我的数据库架构中有四个表,所以我在TestSchemaz上编写了reset()方法,该方法从使用JDBC的表中删除所有行。注意,因为HSQLDB能识别外键,删除表的顺序是很重要的,下面是代码:
public static void reset() throws SchemaException {
Session session = HibernateUtil.getSession();
try {
Connection connection = session.connection();
try {
Statement statement = connection.createStatement();
try {
statement.executeUpdate("delete from Batting");
statement.executeUpdate("delete from Fielding");
statement.executeUpdate("delete from Pitching");
statement.executeUpdate("delete from Player");
connection.commit();
}
finally {
statement.close();
}
}
catch (HibernateException e) {
connection.rollback();
throw new SchemaException(e);
}
catch (SQLException e) {
connection.rollback();
throw new SchemaException(e);
}
}
catch (SQLException e) {
throw new SchemaException(e);
}
finally {
session.close();
}
}
当确定在Hibernate 3.0中进行大量删除操作时,应该能从应用程序中删除直接JDBC的最后一位。到此时为止,必须获取数据库连接并向数据库直接提交SQL。 在确保没有关闭连接的情况下,为了释放资源,只关闭会话就足够了。出于手工编写许多JCBC代码来进行开发的习惯,第一个版本关闭了JDBC连接。因为通过配置Hibernate创建的连接池只带有一个链接,在第一个之后就完全破坏了测试。一定要注意这种情况! 既然在测试类运行时(设想运行所有的测试实例)不能确定数据库的状态,应该在setUp()方法中包含数据库清除,如下所示:
public void setUp() throws Exception {
TestSchema.reset();
}
结束语
在使用像Hibernate这种复杂的O/R映射程序时,必须能够测试实际存在(real-live)的RDBMS,而不会发生任何针对已部署数据库的争论。虽然Hibernate有内置模式生成工具,让此类测试特别简单,但是在这里展示的例子并不排除Hibernate,并且可能与JDO或TopLink一起运行。使用上面描述的设置,您不必离开舒适的IDE环境,但仍然可以对代码进行大量测试。
文章来源于领测软件测试网 https://www.ltesting.net/