麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 12:57:03
字體:
來源:轉載
供稿:網友

  動機
  
  曾經使用許多方法在數據庫和目標代碼之間傳輸數據。從手動編碼的SQL到JDO,然后再到EJB,我從未找到一種非凡喜歡的方法。自從采用測試驅動開發(TDD)作為指導原則以來,這種不滿情緒變得更加強烈。
  
  單元測試的障礙應盡可能少。在關系數據庫中,障礙的范圍從外部依靠(數據庫在運行嗎?)到保持關系模型和對象模型同步的速度。由于這些原因,保持數據庫訪問代碼與核心對象模型分離且無需涉及真實數據庫而進行盡可能多的測試是很重要的。
  
  通常這會導致我們進入下面兩種模式之一。第一種是具體化所有訪問域對象的數據以及數據與單獨類或接口之間的關系。這就是典型的能夠檢索、編輯、刪除和添加域實體的數據存儲對象。
  
  這在單元測試中是最輕易模擬出來的,但趨向于把域模型對象作為不帶有任何關系行為的純數據對象。直接從父對象訪問子記錄是最理想的,而不是將父對象處理為第三方類來決定子記錄。
  
  其他方法已經使訪問接口的域對象進入數據映射層(一種la Martin Fowler的數據映象模式)。這具有推動域模型中的對象關系的優點,在域模型中,對象關系型接口只需表達一次即可。
  
  使用域模型的類不支持持久性機制,因為它本身內在化到域模型中。這使代碼集中在設法解決的業務問題,而很少關注對象關系型映射機制。
  
  我的當前項目涉及到處理大量的棒球統計數據,并使用這些數據進行模擬。因為數據已經在關系數據庫中,所以對于我來說,有機會開發Hibernate對象關系型映射系統。
  
  我曾對Hibernate有很深刻的印象,但我碰到的一個問題是,在使用Hibernate進行單元測試的數據映射時,設法插入一個間接層。
  
  該附加層非常脆弱,編寫起來感到非常困難。實際部署版本簡單地通過了特定于Hibernate的實現。更壞的情況是,模擬版本比真正的“產品級”版本更復雜,只因為模擬版本里沒有基本對象存儲器和帶有Hibernate的映射。
  
  我也使用很多復雜的Hibernate查詢,想要對應用程序的重要部分進行單元測試。然而,對活動的數據庫進行測試不是好主意,因為這幾乎總是產生維護問題。
  
  另外,由于測試最好互相獨立,在測試上下文數據中使用相同的主鍵意味著必須在每次測試前創建代碼來清理數據庫,當涉及到大量關系時就成為一個實際問題。
  
  通過使用HSQLDB和Hibernate強大的模式生成工具,能夠對應用程序映射層進行單元測試,并在對象查詢中找到不計其數的bug,這在以前手工測試時是做不到的。利用下面的技術概述,可以在開發過程中對整個應用程序進行測試,并且在測試有效區域內沒有損害。
  
  設置HSQLDB
  
  以前使用HSQLDB 1.7.3.0 版。為了使用數據庫的內存版本,需要激活org.hsqldb.jdbcDriver的靜態加載程序。當獲得JDBC連接時,就可以使用JDBC url例如jdbc:hspldb:mem:yourdb,這里’yourdb’就是想要使用的內存數據庫的名稱。
  
  因為使用Hibernate (3.0 beta 4),所以我幾乎無需接觸實際活動的JDBC對象。相反,我可以讓Hibernate完成很多繁重的任務,包括從Hibernate映射文件中自動創建數據庫模式。
  
  因為Hibernate創建自身專有的連接池,所以它會基于TestSchema類中的配置代碼自動加載HSQLDB JDBC驅動程序。下面就是該類的靜態的初始化程序。
  
  public class TestSchema {
  
  static {
  Configuration config = new Configuration().
  set  setProperty("hibernate.connection.driver_class", "org.hsqldb.jdbcDriver").
  setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:baseball").
  setProperty("hibernate.connection.username", "sa").
  setProperty("hibernate.connection.pass
Word", "").
  setProperty("hibernate.connection.pool_size", "1").
  setProperty("hibernate.connection.autocommit", "true").
  setProperty("hibernate.cache.provider_class",
  "org.hibernate.cache.HashtableCacheProvider").
  setProperty("hibernate.hbm2ddl.auto", "create-drop").
  setProperty("hibernate.show_sql", "true").
  addClass(Player.class).
  addClass(BattingStint.class).
  addClass(FieldingStint.class).
  addClass(PitchingStint.class);
  
  HibernateUtil.setsessionFactory(config.buildSessionFactory());
  }
  
  Hibernate提供了許多不同的方式來配置該框架,包括程序方面的配置。上述代碼設置了連接池。注重,使用HSQLDB的內存數據庫需要用戶名'sa’。還樣要確保指定一個空格作為口令。為了啟動Hibernate的自動模式生成功能,需設置hibernate.hbm2ddl.auto屬性為’creat-drop’。
  
  實際測試 我的項目是處理將大量的棒球數據,所以我添加了四個進行映射的類(Player、PintchingStint、,BattingSint和FieldStint)。最后創建Hibernate的會話工廠,并將其插入HibernateUtil類,該類只為Hibernate會話的整個應用程序提供一個訪問方法。HibernateUtil的代碼如下:
  
  import org.hibernate.*;
  import org.hibernate.cfg.Configuration;
  
  public class HibernateUtil {
  
  private static SessionFactory factory;
  
  public static synchronized Session getSession() {
  if (factory == null) {
  factory = new Configuration().configure().buildSessionFactory();
  }
  return factory.openSession();
  }
  
  public static void setSessionFactory(SessionFactory factory) {
  HibernateUtil.factory = factory;
  }
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 一级毛片在线免费播放 | 久久人人爽人人爽人人片av免费 | 91久久91久久精品免观看 | 精品在线观看一区 | 天天躁狠狠躁夜躁2020挡不住 | 免费视频www在线观看 | 亚洲精品久久久久久下一站 | 欧美a级毛片 | 亚洲午夜电影 | 亚洲成人精品在线 | av成人免费| 99国产精品欲a | 国产亚洲综合一区二区 | 国产www免费 | 亚洲一区二区三区四区精品 | 久久久久久久九九九九 | 久久精品79国产精品 | 美国一级黄色毛片 | 91 在线 | 日韩黄色av | 激情宗合网| a黄网站 | 欧美日韩免费看 | 制服丝袜日日夜夜 | 一级电影免费看 | 羞羞答答视频 | 午夜视频福利 | 毛片免费视频 | 欧美成年人视频在线观看 | 手机视频在线播放 | 国产精品久久久久久久久久东京 | 91网视频在线观看 | 嫩呦国产一区二区三区av | 大学生一级毛片在线视频 | 久久成人激情视频 | 曰批全过程120分钟免费69 | 久久草在线视频免费 | 九九热精彩视频 | 久久久久久久久久久久久久av | 色网站在线免费观看 | 中文字幕爱爱视频 |