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

現(xiàn)在我們把DatabaseTestCase替換成DBTestCase,并且注釋掉HelloDBUnit中重載的getConnection(不再需要了,父類DBTestCase中已經(jīng)實(shí)現(xiàn)了該方法。)然后執(zhí)行,我們又遇到一個(gè)異常:

org.dbunit.AbstractDatabaseTester$AssertionFailedError:driverClass is null

這是因?yàn)镻ropertiesBasedJdbcDatabaseTester的initialize方法(見上面代碼)用來初始化數(shù)據(jù)庫連接參數(shù):

protected void initialize() throwsException
{
   logger.debug("initialize() - start");
   setDriverClass(System.getProperty(DRIVER_CLASS));
   setConnectionUrl(System.getProperty(CONNECTION_URL));
   setUsername(System.getProperty(USERNAME));
   setPassword(System.getProperty(PASSWORD));
   // 如果所用測試帳戶是 DBA,為了避免出現(xiàn) AmbiguousTableNameException
   // 異常,必須明確給出 SCHEMA。注意 SCHEMA要大寫**
   // setSchema(System.getProperty(SCHEMA));
   super.initialize();
}

從這里我們看到DBTestCase需要從系統(tǒng)變量中獲得連接參數(shù),所以我們必須修改HelloDBUnit的構(gòu)造函數(shù),將配置參數(shù)讀入系統(tǒng)變量:

public HelloDBUnit() throws IOException
{
   super();
      props.load(Resources.getResourceAsStream("database.properties"));
      if(null == context)
      {
         context = new ClassPathXmlApplicationContext(
            "classpath:ApplicationContext.xml");
      }
   System.setProperty(
      PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
      props.getProperty("database.connection.driver_class"));
   System.setProperty(
      PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,
      props.getProperty("database.connection.url"));
   System.setProperty(
      PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,
      props.getProperty("database.connection.username"));
   System.setProperty(
      PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,
      props.getProperty("database.connection.password"));
}

現(xiàn)在可以正確執(zhí)行了。不過,這依然存在遺憾,既然我們使所有配置參數(shù)都文本化了,不希望看到

   System.setProperty(
      PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
      props.getProperty("database.connection.driver_class"));

這樣的代碼,因?yàn)槿绻覀冇卸鄠(gè)數(shù)據(jù)源,或改變了配置文件,我們不得不還需要改變測試用例的代碼?梢杂肈ataSourceBasedDBTestCase 來解決這個(gè)問題。

DataSourceBasedDBTestCase類
DataSourceBasedDBTestCase 抽象類要求子類實(shí)現(xiàn) getDataSource 方法以獲取外部數(shù)據(jù)源。

首先,改變父類為 DataSourceBasedDBTestCase 。然后移除構(gòu)造函數(shù)中關(guān)于系統(tǒng)變量的設(shè)置。后加入以下代碼:

@Override
protected DataSource getDataSource(){
   return(DataSource)context.getBean("dataSource");
}

org.dbunit.database.AmbiguousTableNameException異常
** 很遺憾, DataSourceBasedDBTestCase 沒有提供設(shè)置 SCHEMA 的方法,雖然它的成員變量 DataSourceBasedDBTester 通過繼承了 AbstractDatabaseTester 而提供了 setSchema 方法,但是因?yàn)樗械?IDatabaseTester 都是 Private 變量,因此實(shí)際上我們無法訪問到它的 setSchema。所以如果使用 DataSourceBasedDBTestCase ,除非重載 setUp 和tearDown方法,否則不能有DBA權(quán)限。

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