国产探花免费观看_亚洲丰满少妇自慰呻吟_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環境,但仍然可以對代碼進行大量測試。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 工布江达县| 奉化市| 烟台市| 随州市| 伊宁县| 义乌市| 平陆县| 江西省| 唐河县| 岗巴县| 慈溪市| 崇礼县| 揭阳市| 礼泉县| 长乐市| 青河县| 武威市| 浮梁县| 蚌埠市| 清丰县| 遂川县| 梅河口市| 平度市| 濮阳市| 房产| 郓城县| 海口市| 苏尼特右旗| 大渡口区| 九台市| 天镇县| 射阳县| 德格县| 富蕴县| 金塔县| 玉田县| 东源县| 通化县| 长丰县| 静乐县| 天峻县|