简单讲解Hibernate单元测试

来源:岁月联盟 编辑:zhuzhu 时间:2009-09-25

Hibernate还是比较常用的,于是我研究了一下Hibernate单元测试,在这里拿出来和大家分享一下,希望对大家有用。

本文介绍在Hibernate单元测试中最重要的就是要保持测试实例是独立的。因为该方法仍然涉及数据库,所以需要一种方法在每个Hibernate单元测试实例之前清理数据库。在我的数据库架构中有四个表,所以我在TestSchemaz上编写了reset()方法,该方法从使用JDBC的表中删除所有行。注意,因为HSQLDB能识别外键,删除表的顺序是很重要的,下面是代码:

  1. public static void reset() throws SchemaException {  
  2. Session session = HibernateUtil.getSession();  
  3. try {  
  4. Connection connection = session.connection();  
  5. try {  
  6. Statement statement = connection.createStatement();  
  7. try {  
  8. statement.executeUpdate("delete from Batting");  
  9. statement.executeUpdate("delete from Fielding");  
  10. statement.executeUpdate("delete from Pitching");  
  11. statement.executeUpdate("delete from Player");  
  12. connection.commit();  
  13. }  
  14. finally {  
  15. statement.close();  
  16. }  
  17. }  
  18. catch (HibernateException e) {  
  19. connection.rollback();  
  20. throw new SchemaException(e);  
  21. }  
  22. catch (SQLException e) {  
  23. connection.rollback();  
  24. throw new SchemaException(e);  
  25. }  
  26. }  
  27. catch (SQLException e) {  
  28. throw new SchemaException(e);  
  29. }  
  30. finally {  
  31. session.close();  
  32. }  

当确定在Hibernate 3.0中进行大量删除操作时,应该能从应用程序中删除直接JDBC的最后一位。到此时为止,必须获取数据库连接并向数据库直接提交SQL。在确保没有关闭连接的情况下,为了释放资源,只关闭会话就足够了。出于手工编写许多JCBC代码来进行开发的习惯,第一个版本关闭了JDBC连接。因为通过配置Hibernate创建的连接池只带有一个链接,在第一个之后就完全破坏了测试。一定要注意这种情况!既然在测试类运行时(设想运行所有的测试实例)不能确定数据库的状态,应该在setUp()方法中包含数据库清除,如下所示:

  1. public void setUp() throws Exception {  
  2. TestSchema.reset();