@ShouldMatchDataSet orderBy does not work properly
kuniim Sep 20, 2013 5:58 AMHi,
I am using Arquillian Persistence Extension 1.0.0.alpha6 with Arquillian 1.0.3.Final and found @ShouldMatchDataSet's orderBy does not work properly because of the bug of DBUnit about sorting(https://sourceforge.net/p/dbunit/bugs/347/).
For example, there is testcase below:
@Test
@UsingDataSet("seeding.xml")
@ShouldMatchDataSet(value = "seeding.xml", orderBy = {"id"})
public void should_entity_found_xls() {
}
seeding data is:
<dataset> <TEST id="113" text="text113"/> <TEST id="1" text="text1"/> <TEST id="12" text="text12"/> </dataset>
When column "id" is number data type, this testcase will be faild.
java.lang.AssertionError: Test failed in 4 cases. test | In row 1: expected value of id "113" but was "12". test | In row 1: expected value of text "text113" but was "text12". test | In row 2: expected value of id "12" but was "113". test | In row 2: expected value of text "text12" but was "text113".
Actual database data is sorted properly like:
<TEST id="1" text="text1"/> <TEST id="12" text="text12"/> <TEST id="113" text="text113"/>
But expected data is sorted like:
<TEST id="1" text="text1"/> <TEST id="113" text="text113"/> <TEST id="12" text="text12"/>
Then APE will compare with bad ordered rows.
If we avoid this problem, we have to do something below:
- Only using string column to sort
- Not sort expected dataset at line 86 org.jboss.arquillian.persistence.dbunit.DataSetComparator#compareContent
- final ITable expectedTable = sort(expectedDataSet, tableName, columnsForSorting);
- Create a wrapper of Table object to sort and use it with meta data of current dataset at org.jboss.arquillian.persistence.dbunit.DataSetComparator#sort
import org.dbunit.dataset.AbstractTable;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.ITableMetaData;
public class TableWrapper extends AbstractTable {
ITable table;
ITableMetaData metaData;
public TableWrapper(ITable table, ITableMetaData metaData) {
this.table = table;
this.metaData = metaData;
}
@Override
public ITableMetaData getTableMetaData() {
return metaData;
}
@Override
public int getRowCount() {
return table.getRowCount();
}
@Override
public Object getValue(int row, String column) throws DataSetException {
return table.getValue(row, column);
}
}
At line 86 DataSetComparator#compareContent
- final ITable expectedTable = sort(expectedDataSet, tableName, columnsForSorting); + final ITable expectedTable = sort(expectedDataSet.getTable(tableName), filteredCurrentDataSet.getTable(tableName), columnsForSorting);
DataSetComparator#sort
- private ITable sort(IDataSet dataSet, String tableName, final List<String> columnsForSorting) throws DataSetException
+ private ITable sort(ITable table, ITableMetaData tableMetaData, final List<String> columnsForSorting) throws DataSetException
{
- final SortedTable sortedTable = new SortedTable(dataSet.getTable(tableName), toArray(columnsForSorting));
+ final SortedTable sortedTable = new SortedTable(new TableWrapper(table, tableMetaData), toArray(columnsForSorting));
sortedTable.setUseComparable(true);
return sortedTable;
}
- Wait for the DBUnit bug fixed
Or is there any work around for this?
Thanks,
Masao