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

如果希望業(yè)務類也支持事務處理可以加入以下配置,否則可以略過:

<bean id="accountManagerTarget" class="com.wang.dbunit.AccountManager">
   <property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<bean id="accountManager" class="org.springframework.aop.framework.ProxyFactoryBean">
   <property name="proxyInterfaces">
      <value>
          com.wang.dbunit.IAccountManager
      </value>
   </property>
   <property name="interceptorNames">
      <list>
          <idref local="transactionInterceptor" />
          <idref local="accountManagerTarget" />
      </list>
   </property>
</bean>

以上配置只作用于使業(yè)務類,因為我們的測試用例類“HelloDBUnit.java”沒有出現(xiàn)在配置文件中,更沒有設置任何攔截器,所以測試用例對數(shù)據(jù)庫的所有操作(插入、清除測試數(shù)據(jù))目前都不在攔截范圍。我們必須在測試用例中手工為它加入事務處理,才可以達到我們的目的。

添加事務管理代碼
添加以下屬性和方法:

private TransactionStatus ts = null;
private DataSourceTransactionManager transactionManager = null;
......
protected void setUpTransaction()
{
   transactionManager
      =(DataSourceTransactionManager)context.getBean(
         "transactionManager");
   TransactionDefinition td = new DefaultTransactionDefinition();
   ts = transactionManager.getTransaction(td);
}
protected void tearDownTransaction(boolean commit)
{
   if(commit)
   {
      transactionManager.commit(ts);
   }
   else
   {
      transactionManager.rollback(ts);
   }
}

修改setUp和tearDown方法:

protected void setUp() throws Exception
{
   setUpTransaction();
   DataSourced ataSource = getDataSource();
   // 替換 Connection connection = dataSource.getConnection();
   Connection connection = DataSourceUtils.getConnection(dataSource);
   IDatabaseConnection dbUnitCon
      = new DatabaseConnection(connection, "SYSTEM");
   if(getDataSet()!= null)
   {
      try
      {
         getSetUpOperation().execute(dbUnitCon, getDataSet());
      }
      finally
      {
         if(connection!= null)
         {
            // 替換 connection.close();
            DataSourceUtils.releaseConnection(
               connection, dataSource);
          }
      }
   }
}
protected void tearDown() throws Exception
{
   DataSource dataSource = getDataSource();
   // 替換 Connection connection = dataSource.getConnection();
   Connection connection = DataSourceUtils.getConnection(dataSource);
   IDatabaseConnection dbUnitCon
      = new DatabaseConnection(connection, "SYSTEM");
   if(getDataSet() != null)
   {
      try
      {
          // 如果不希望回滾數(shù)據(jù),傳入 true 參數(shù)。
          tearDownTransaction(false);
          getTearDownOperation().execute(dbUnitCon, getDataSet());
      }
      finally
      {
         if(connection!= null)
         {
            // 替換 connection.close();
            DataSourceUtils.releaseConnection(
               connection, dataSource);
          }
      }
   }
}

后修改getTearDownOperation,用 DELETE 替換 DELETE_ALL:

protected DatabaseOperation getTearDownOperation() throws Exception
{
    return DatabaseOperation.DELETE;
}

現(xiàn)在在表中隨便添加一些記錄,然后執(zhí)行我們的測試用例,執(zhí)行完后,手工添加的數(shù)據(jù)沒有受到任何影響。


后一點提示
因為每一個 testXxx 方法時都會初始化一個測試用例,所以每執(zhí)行一次 testXxxx 方法都會導致 setUp 和 tearDown 方法被調(diào)用一次,而本例的事務定義也都由 setUp 開始, tearDown 結(jié)束,也意味著不同測試方法(同一測試用例)之間處于不同的事務范圍,導致數(shù)據(jù)操作結(jié)果無法共享(如果每次 tearDown 都回滾數(shù)據(jù))。比如在 testInsert 方法中插入數(shù)據(jù),在 testSelect 無法獲得。要解決這個問題,要適當?shù)男薷膶?setUpTransaction 和 dearDownTransaction 的調(diào)用,使得事務可以在全局范圍內(nèi)被多個 test 方法共享。
E:workpm2_v1_00 est.xml:171: org.dbunit.dataset.NoSuchTableException: VERSION_INFO
DBunit 要求schema 大寫google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);

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