然而QueryDataSet好像只能接受從connection資料來建立...這不符合我的需求,找到一個好方法,就是使用RowFilterTable 搭配IRowFilter,直接來看code:
public static ITable filterXmlDataCol(
String xmlDataFile, String tableName,IDatabaseConnection conn
, final String expectColNames[] , final Object expectColVals[]) throws Exception {
IDataSet databaseDataSet = getDataSetFromXmlFile(xmlDataFile);
ITable actualTable = databaseDataSet.getTable(tableName);
IRowFilter rowFilter = new IRowFilter() {
@Override
public boolean accept(IRowValueProvider rowValueProvider) {
try {
for(int i=0 ; i< expectColNames.length ; ++i){
Object columnValue = rowValueProvider.getColumnValue(expectColNames[i]);
if (!columnValue.equals(expectColVals[i]))
return false;
}
return true;
} catch (DataSetException ex) {
ex.printStackTrace();
}
return false;
}
};
RowFilterTable filteredRowsTable = new RowFilterTable(
actualTable, rowFilter);
return filteredRowsTable;
}
使用方式:
現有XML DATA:
我只希望以XMLDATA建立出的ITable有條件:product == "17公司" and name=="tables"的資料,那麼就照以下方式呼叫:
ITable expect = DBUnitUtilities.filterXmlDataCol("datasheet\\FactoryInfo.xml","FactoryInfo"
, _dbunitConnection,new String[]{"name","product"},new String[]{"17公司","tales"} );
這樣就可以過濾囉~~
debug一下其實可以發現RowFilterTable並不是真的將資料給"過濾"掉了,只是將原先的Table給wrap後,然後帶入自行建立的IRowFilter(上述line 8~23),並在每一次巡迴column資料時以自定義的@ovverride accept()回傳true(資料保留) 或 false(資料移除)
回傳true的row index就會被保留在filteredRowIndexes這個List中囉。
p.s:
星期一就要交差幾乎會開天窗的我居然還在研究test.....只希望我這個堅持是對的....畢竟我真的不想再寫垃圾Code穩定度又差又無法擴充又不敢修改的爛東西了阿.........0rz...
參考:Filtering data sets and comparing results using DBUnit
沒有留言:
張貼留言