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

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

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

  動機
  
  曾經使用許多方法在數據庫和目標代碼之間傳輸數據從手動編碼的SQL到JDO然後再到EJB我從未找到一種特別喜歡的方法自從采用測試驅動開發(TDD)作為指導原則以來這種不滿情緒變得更加強烈
  
  單元測試的障礙應盡可能少在關系數據庫中障礙的范圍從外部依賴(數據庫在運行嗎?)到保持關系模型和對象模型同步的速度由於這些原因保持數據庫訪問代碼與核心對象模型分離且無需涉及真實數據庫而進行盡可能多的測試是很重要的
  
  通常這會導致我們進入下面兩種模式之一第一種是具體化所有訪問域對象的數據以及數據與單獨類或接口之間的關系這就是典型的能夠檢索編輯刪除和添加域實體的數據存儲對象
  
  這在單元測試中是最容易模擬出來的但趨向於把域模型對象作為不帶有任何關系行為的純數據對象直接從父對象訪問子記錄是最理想的而不是將父對象處理為第三方類來決定子記錄
  
  其他方法已經使訪問接口的域對象進入數據映射層(一種la Martin Fowler的數據映象模式)這具有推動域模型中的對象關系的優點在域模型中對象關系型接口只需表達一次即可
  
  使用域模型的類不支持持久性機制因為它本身內在化到域模型中這使代碼集中在設法解決的業務問題而很少關注對象關系型映射機制
  
  我的當前項目涉及到處理大量的棒球統計數據並使用這些數據進行模擬因為數據已經在關系數據庫中所以對於我來說有機會開發Hibernate對象關系型映射系統
  
  我曾對Hibernate有很深刻的印象但我遇到的一個問題是在使用Hibernate進行單元測試的數據映射時設法插入一個間接層
  
  該附加層非常脆弱編寫起來感到非常困難實際部署版本簡單地通過了特定於Hibernate的實現更壞的情況是模擬版本比真正的產品級版本更復雜只因為模擬版本裡沒有基本對象存儲器和帶有Hibernate的映射
  
  我也使用很多復雜的Hibernate查詢想要對應用程序的重要部分進行單元測試然而對活動的數據庫進行測試不是好主意因為這幾乎總是產生維護問題
  
  另外由於測試最好互相獨立在測試上下文數據中使用相同的主鍵意味著必須在每次測試前創建代碼來清理數據庫當涉及到大量關系時就成為一個實際問題
  
  通過使用HSQLDB和Hibernate強大的模式生成工具能夠對應用程序映射層進行單元測試並在對象查詢中找到不計其數的bug這在以前手工測試時是做不到的利用下面的技術概述可以在開發過程中對整個應用程序進行測試並且在測試有效區域內沒有損害
  
  設置HSQLDB
  
  以前使用HSQLDB 為了使用數據庫的內存版本需要激活orghsqldbjdbcDriver的靜態加載程序當獲得JDBC連接時就可以使用JDBC url例如jdbc:hspldb:mem:yourdb這裡yourdb就是想要使用的內存數據庫的名稱
  
  因為使用Hibernate ( beta )所以我幾乎無需接觸實際活動的JDBC對象相反我可以讓Hibernate完成很多繁重的任務包括從Hibernate映射文件中自動創建數據庫模式
  
  因為Hibernate創建自身專有的連接池所以它會基於TestSchema類中的配置代碼自動加載HSQLDB JDBC驅動程序下面就是該類的靜態的初始化程序
  
  public class TestSchema {
  
  static {
  Configuration config = new Configuration()
  setProperty(hibernatedialect orghibernatedialectHSQLDialect)
  setProperty(nnectiondriver_class orghsqldbjdbcDriver)
  setProperty(nnectionurl jdbc:hsqldb:mem:baseball)
  setProperty(nnectionusername sa)
  setProperty(nnectionpassword )
  setProperty(nnectionpool_size )
  setProperty(nnectionautocommit true)
  setProperty(hibernatecacheprovider_class
  orghibernatecacheHashtableCacheProvider)
  setProperty(hibernatehbmddlauto createdrop)
  setProperty(hibernateshow_sql true)
  addClass(Playerclass)
  addClass(BattingStintclass)
  addClass(FieldingStintclass)
  addClass(PitchingStintclass);
  
  HibernateUtilsetSessionFactory(configbuildSessionFactory());
  }
  
  Hibernate提供了許多不同的方式來配置該框架包括程序方面的配置上述代碼設置了連接池注意使用HSQLDB的內存數據庫需要用戶名sa還樣要確保指定一個空格作為口令為了啟動Hibernate的自動模式生成功能需設置hibernatehbmddlauto屬性為creatdrop
  
  實際測試 我的項目是處理將大量的棒球數據所以我添加了四個進行映射的類(PlayerPintchingStintBattingSint和FieldStint)最後創建Hibernate的會話工廠並將其插入HibernateUtil類該類只為Hibernate會話的整個應用程序提供一個訪問方法HibernateUtil的代碼如下
  
  import orghibernate*;
  import orghibernatecfgConfiguration;
  
  public class HibernateUtil {
  
  private static SessionFactory factory;
  
  public static synchronized Session getSession() {
  if (factory == null) {
  factory = new Configuration(nfigure()buildSessionFactory();
  }
  return factoryopenSession();
  }
  
  public static void setSessionFactory(SessionFactory factory) {
  HibernateUtilfactory = factory;
  }
  }
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28592.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.