熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

利用HSQLDB進行Hibernate的單元測試二

2013-11-23 20:20:57  來源: Java開源技術 

  因為所有代碼(經過單元測試的產品級代碼)都是從HibernateUtil獲取Hibernate會話所以能在同一個位置對其進行配置為了對代碼的第一位進行單元測試而訪問TestSchema類將會激活靜態初始化程序該程序將安裝Hibernate並且將測試SessionFactory插入到HibernateUtil中對於產品級代碼可以使用標准hibernatecfgxml配置機制來初始化 SessionFactory
  
  那麼單元測試中的外部特征是什麼?下面的測試代碼片段是用來檢查邏輯的決定運動員在棒球聯盟比賽中是哪個位置的人選
  
  public void testGetEligiblePositions() throws Exception {
  Player player = new Player(playerId);
  TestSchemaaddPlayer(player);
  
  FieldingStint stint = new FieldingStint
  (playerId SEA PositionCATCHER);
  stintsetGames();
  TestSchemaaddFieldingStint(stint);
  
  Set<Position> positions = playergetEligiblePositions();
  assertEquals( positionssize());
  assertTrue(ntains(PositionCATCHER));
  }
  
  第一次創建新Player實例並通過addPlayer()方法添加到TestSchema中必須首先完成此步驟因為FidldStint類和Player類之間有外鍵關系如果不首先添加該實例在設法添加FieldingStint時將會出現外鍵約束違例
  
  一旦測試上下文就位就可以測試getEligiblePositions()方法來檢索校正數據下面是在TsetSchema中addPlayer()方法的代碼您將注意到使用Hibernate而不是baremetal JDBC代碼
  
  public static void addPlayer(Player player) {
  if (playergetPlayerId() == null) {
  throw new IllegalArgumentException(No primary key specified);
  }
  
  Session session = HibernateUtilgetSession();
  Transaction transaction = sessionbeginTransaction();
  try {
  sessionsave(player playergetPlayerId());
  mit();
  }
  finally {
  sessionclose();
  }
  }
  
  在單元測試中最重要的就是要保持測試實例是獨立的因為該方法仍然涉及數據庫所以需要一種方法在每個測試實例之前清理數據庫在我的數據庫架構中有四個表所以我在TestSchemaz上編寫了reset()方法該方法從使用JDBC的表中刪除所有行注意因為HSQLDB能識別外鍵刪除表的順序是很重要的下面是代碼
  
  public static void reset() throws SchemaException {
  Session session = HibernateUtilgetSession();
  try {
  Connection connection = nnection();
  try {
  Statement statement = connectioncreateStatement();
  try {
  statementexecuteUpdate(delete from Batting);
  statementexecuteUpdate(delete from Fielding);
  statementexecuteUpdate(delete from Pitching);
  statementexecuteUpdate(delete from Player);
  mit();
  }
  finally {
  statementclose();
  }
  }
  catch (HibernateException e) {
  connectionrollback();
  throw new SchemaException(e);
  }
  catch (SQLException e) {
  connectionrollback();
  throw new SchemaException(e);
  }
  }
  catch (SQLException e) {
  throw new SchemaException(e);
  }
  finally {
  sessionclose();
  }
  }
  當確定在Hibernate 中進行大量刪除操作時應該能從應用程序中刪除直接JDBC的最後一位到此時為止必須獲取數據庫連接並向數據庫直接提交SQL
  
  在確保沒有關閉連接的情況下為了釋放資源只關閉會話就足夠了出於手工編寫許多JCBC代碼來進行開發的習慣第一個版本關閉了JDBC連接因為通過配置Hibernate創建的連接池只帶有一個鏈接在第一個之後就完全破壞了測試一定要注意這種情況!
  
  既然在測試類運行時(設想運行所有的測試實例)不能確定數據庫的狀態應該在setUp()方法中包含數據庫清除如下所示:
  
  public void setUp() throws Exception {
  TestSchemareset();
  }
  
  結束語
  
  在使用像Hibernate這種復雜的O/R映射程序時必須能夠測試實際存在(reallive)的RDBMS而不會發生任何針對已部署數據庫的爭論雖然Hibernate有內置模式生成工具讓此類測試特別簡單但是在這裡展示的例子並不排除Hibernate並且可能與JDO或TopLink一起運行使用上面描述的設置您不必離開舒適的IDE環境但仍然可以對代碼進行大量測試
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28343.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.