国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

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

  因為所有代碼(經過單元測試的產品級代碼)都是從HibernateUtil獲取Hibernate會話,所以能在同一個位置對其進行配置。為了對代碼的第一位進行單元測試而訪問TestSchema類將會激活靜態初始化程序,該程序將安裝Hibernate并且將測試sessionFactory插入到HibernateUtil中。對于產品級代碼,可以使用標準hibernate.cfg.xml配置機制來初始化 SessionFactory。
  
  那么單元測試中的外部特征是什么?下面的測試代碼片段是用來檢查邏輯的,決定運動員在棒球聯盟比賽中是哪個位置的人選:
  
  public void testGetEligiblePositions() throws Exception {
  Player player = new Player("playerId");
  TestSchema.addPlayer(player);
  
  FieldingStint stint1 = new FieldingStint
  ("playerId", 2004, "SEA", Position.CATCHER);
  stint1.setGames(20);
  TestSchema.addFieldingStint(stint1);
  
  Set<Position> positions = player.getEligiblePositions(2004);
  assertEquals(1, positions.size());
  assertTrue(positions.contains(Position.CATCHER));
  }
  
  第一次創建新Player實例并通過addPlayer()方法添加到TestSchema中。必須首先完成此步驟,因為FidldStint類和Player類之間有外鍵關系。假如不首先添加該實例,在設法添加FieldingStint時將會出現外鍵約束違例。
  
  一旦測試上下文就位,就可以測試getEligiblePositions()方法來檢索校正數據。下面是在TsetSchema中addPlayer()方法的代碼。您將注重到使用Hibernate而不是bare-metal JDBC代碼:
  
  public static void addPlayer(Player player) {
  if (player.getPlayerId() == null) {
  throw new IllegalArgumentException("No PRimary key specified");
  }
  
  Session session = HibernateUtil.getSession();
  Transaction transaction = session.beginTransaction();
  try {
  session.save(player, player.getPlayerId());
  transaction.commit();
  }
  finally {
  session.close();
  }
  }
  
  在單元測試中最重要的就是要保持測試實例是獨立的。因為該方法仍然涉及數據庫,所以需要一種方法在每個測試實例之前清理數據庫。在我的數據庫架構中有四個表,所以我在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環境,但仍然可以對代碼進行大量測試。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平远县| 枝江市| 苗栗县| 策勒县| 崇仁县| 黄山市| 天水市| 潼关县| 崇义县| 布拖县| 永德县| 合水县| 合江县| 河间市| 静海县| 股票| 桃园县| 前郭尔| 遵义市| 玉树县| 佛山市| 东光县| 灌南县| 聂拉木县| 康乐县| 四子王旗| 平南县| 曲靖市| 浪卡子县| 海门市| 北安市| 岳阳县| 桑植县| 左权县| 衡阳县| 广灵县| 临海市| 类乌齐县| 乐东| 尼木县| 宁强县|