現(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方法(見(jiàn)上面代碼)用來(lái)初始化數(shù)據(jù)庫(kù)連接參數(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));
// 如果所用測(cè)試帳戶是 DBA,為了避免出現(xiàn) AmbiguousTableNameException
// 異常,必須明確給出 SCHEMA。注意 SCHEMA要大寫(xiě)**
// 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í)行了。不過(guò),這依然存在遺憾,既然我們使所有配置參數(shù)都文本化了,不希望看到
System.setProperty(
PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
props.getProperty("database.connection.driver_class"));
這樣的代碼,因?yàn)槿绻覀冇卸鄠(gè)數(shù)據(jù)源,或改變了配置文件,我們不得不還需要改變測(cè)試用例的代碼。可以用DataSourceBasedDBTestCase 來(lái)解決這個(gè)問(wèn)題。
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 沒(méi)有提供設(shè)置 SCHEMA 的方法,雖然它的成員變量 DataSourceBasedDBTester 通過(guò)繼承了 AbstractDatabaseTester 而提供了 setSchema 方法,但是因?yàn)樗械?IDatabaseTester 都是 Private 變量,因此實(shí)際上我們無(wú)法訪問(wèn)到它的 setSchema。所以如果使用 DataSourceBasedDBTestCase ,除非重載 setUp 和tearDown方法,否則不能有DBA權(quán)限。