您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > DBunit
Spring+iBatis+DBUnit 進行單元測試
作者:網絡轉載 發(fā)布時間:[ 2013/12/24 13:43:59 ] 推薦標簽:單元測試 開源 測試

因為所有的IDatabaseTester實現(包括DefaultDatabaseTester)都繼承自AbatractDatabaseTester,這個抽象類有一個統一的執(zhí)行數據庫操作的方法executeOperation,原代碼如下:

private void executeOperation(DatabaseOperation operation) throws Exception
{
   logger.debug("executeOperation(operation={})- start", operation);
   if(operation != DatabaseOperation.NONE ){
      // IDatabaseTester 的 getConnection 方法,不是重載的那個。
      IDatabaseConnection connection = getConnection();
      try{
          operation.execute(connection, getDataSet() );
      }
      finally{
         closeConnection(connection);
      }
   }
}

我們看到每執(zhí)行完一次操作,數據庫連接都會被關閉,所以如果繼承DefaultDatabaseTester,將導致只能執(zhí)行一次數據庫操作。
如果希望在一個TestCase里執(zhí)行兩次操作,我們可以使用另一個基類


DBTestCase類
如上面所看到的,問題出在DatabaseTestCase的newDatabaseTester方法返回了一個無法重復利用的DefaultDatabaseTester實例,所以DBTestCase的newDatabaseTester方法代碼變更如下:

protected IDatabaseTester newDatabaseTester() throws Exception {
   return new PropertiesBasedJdbcDatabaseTester();
}

它用來生成實例的是 PropertiesBasedJdbcDatabaseTester 類,而不是 DefaultDatabaseTester 。這個類的父類 JdbcDatabaseTester(也繼承自 AbstractDatabaseTester)的 getConnection 方法:

public IDatabaseConnection getConnection() throws Exception
{
   logger.debug("getConnection() - start");
   if(!initialized ){
      // 注意這個方法,等一下詳解
      initialize();
   }
   assertNotNullNorEmpty("connectionUrl", connectionUrl);
   Connection conn = null;
   if(username == null && password == null ){
      conn = DriverManager.getConnection(connectionUrl);
   }else{
      Conn = DriverManager.getConnection(connectionUrl,username,password);
   }
   return new DatabaseConnection( conn, getSchema() );
}

可以看到每次調用這個方法,都會新建一個連接,而不是簡單的返回我們重載的 getConnection 中返回的連接的引用。這樣避免了 DefaultDatabaseTester 僅僅是簡單返回之前的連接而倒置的問題。不過這也意味著用 DBTestCase 不用我們自己去重載 getConnection 了,因為 DBTestCase 已經實現了這個方法(DatabaseTestCase沒有實現):

protected IDatabaseConnection getConnection() throws Exception {
   logger.debug("getConnection() - start");
   final IDatabaseTester databaseTester = getDatabaseTester();
   assertNotNull( "DatabaseTester is not set",databaseTester);
   return databaseTester.getConnection();
}

我們看到DBTestCase的getConnection簡單的把這個方法轉給JdbcDatabaseTester(IDatabaseTester) 的getConnection。而JdbcDatabaseTester的實現我們在前面已經看到了。

上一頁12345678下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd