有了這兩個基本的方法以后,DBUnit可以按照它預先缺省的行為工作了。DatabaseTestCase類提供了兩個fixture(我叫它固件,不知仁兄同意否?)方法來控制測試前和測試后的數(shù)據(jù)庫狀態(tài)。這兩個方法是:
getSetUpOperation() 和 getTearDownOperation().
一種高效的實施方案是讓getSetUpOperation()方法執(zhí)行REFRESH操作,通過這個操作,我們可以用種子文件中的數(shù)據(jù)去更新目標數(shù)據(jù)庫里的數(shù)據(jù)。接下來,是getTearDownOperation(),讓他去執(zhí)行一個NONE操作,也是什么也不執(zhí)行。
protected DatabaseOperation getSetUpOperation()
throws
Exception {
return DatabaseOperation.REFRESH;
}
protected DatabaseOperation getTearDownOperation()
throws
Exception {
return DatabaseOperation.NONE;
}
還有一種有效的方法是在getSetUpOperation()方法中執(zhí)行CLEAN_INSERT操作,這樣首先會將目標數(shù)據(jù)庫中與我們提供的種子文件一致的數(shù)據(jù)刪除,然后將我們提供的數(shù)據(jù)插入到數(shù)據(jù)庫中。這個實施順序保證了我們對數(shù)據(jù)庫的精確控制。
代碼樣例
在一個基于J2EE的人力資源系統(tǒng)中,我們很希望對某個數(shù)據(jù)操作周期實現(xiàn)測試自動化,這個操作周期包括職員的新增,檢索,更新和刪除。遠程接口定義了下列的業(yè)務方法(為了簡潔清楚,省略了方法中的throws子句).
//譯者注:這里的EmployeeValueObject類型對象,譯者認為是代表職員實體信息的對象。
public void createEmployee( EmployeeValueObject emplVo )
public EmployeeValueObject getEmployeeBySocialSecNum( String ssn )
public void updateEmployee( EmployeeValueObject emplVo )
public void deleteEmployee( EmployeeValueObject emplVo )
測試getEmployeeBySocialSecNum()方法
需要植入一條數(shù)據(jù)到目標數(shù)據(jù)庫中,另外,測試deleteEmployee()方法和updateEmployee()方法時,同樣也是在先前植入的這條記錄的基礎(chǔ)上進行。后,測試類會首先利用createEmployee()方法創(chuàng)建一條記錄,同時我們需要校驗執(zhí)行這個方法時,是否會有異常發(fā)生!
下面這個DBUnit種子文件,叫做"employee_hr_seed.xml",下面將用到這個文件。
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<EMPLOYEE employee_uid='1'
start_date='2001-01-01'
first_name='Drew' ssn='333-29-9999'
last_name='Smith' />
<EMPLOYEE employee_uid='2'
start_date='2002-04-04'
first_name='Nick' ssn='222-90-1111'
last_name='Marquiss' />
<EMPLOYEE employee_uid='3'
start_date='2003-06-03'
first_name='Jose' ssn='111-67-2222'
last_name='Whitson' />
</dataset>