我使用DBUnit来测试我的数据库。 我的数据库不是空的,所以我想要的是忽略现有元素并测试我的测试插入的数据。
这是测试运行方式的一个示例:
1-表包含10个元素
2- DBUnit从数据集中插入一些数据(3个元素)
3-我的测试插入数据(1个元素)
4-我的预期数据集包含4个元素,这些元素是第一个数据集中定义的3个元素和最近由测试添加的元素
5-所以,当我对实际表和预期表执行断言等于它时,它会显示一个错误,这是正常的,因为我的表已经包含了元素。
问题是: 有没有办法忽略断言中数据库中存在的元素? 我只想测试数据集和测试插入的数据。
这是代码:
@Override
protected IDataSet getDataSet() throws Exception {
// transforme fichier XML en BDD
URL url = this.getClass().getResource("/dataset-peqt2-init.xml");
File testFile = new File(url.getFile());
return new FlatXmlDataSetBuilder().build(testFile);
}
@Override
protected DatabaseOperation getSetUpOperation() throws Exception
{
return DatabaseOperation.REFRESH;
}
/**
* Reset the state of database
* Called before every test
*/
@Override
protected DatabaseOperation getTearDownOperation() throws Exception
{
return DatabaseOperation.DELETE;
}
/**
* get the actual table from the database
* @param tableName
* @return
* @throws Exception
* @throws SQLException
* @throws DataSetException
*/
private ITable getActualTable(String tableName) throws Exception, SQLException, DataSetException {
// get the actual table values
IDatabaseConnection connection = getConnection();
IDataSet databaseDataSet = connection.createDataSet();
return databaseDataSet.getTable(tableName);
}
/**
* get the expected table from the dataset
* @param tableName
* @param fileName
* @return
* @throws Exception
*/
private ITable getExpectedTable(String tableName, String fileName) throws Exception {
// get the expected table values
URL url = this.getClass().getResource("/"+fileName);
File testFile = new File(url.getFile());
IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(testFile);
return expectedDataSet.getTable(tableName);
}
@Test
public void test01_insert() throws SQLException, Exception {
File file = new File(SynchroDerbi.class.getResource("/test-insert.lst").getFile());
log.debug("test01_insert() avec ref : "+file.getName());
SynchroDerbi.run(file);
String fileName = "dataset-insert-expected.xml";
actualTable = getActualTable("equipment");
expectedTable = getExpectedTable("equipment",fileName);
Assertion.assertEqualsIgnoreCols(expectedTable, actualTable, new String[]{"id","idSite"});
}
答案 0 :(得分:1)
DatabaseOperation.CLEAN_INSERT;
中的getSetUpOperation()
。
通过这种方式,操作首先将删除所有表记录,然后执行数据集插入。
答案 1 :(得分:0)
您的测试不应取决于系统的当前状态。因此,不应断言相等,而应使用“包含”检查。您从select中获得结果,然后断言那些包含刚刚插入的结果。
如果你想对你的支票更严格(这可能会影响测试的可维护性),你可以选择之前的N个记录,然后插入然后检查BEFORE + N = AFTER。
PS:DBUnit不是一个非常灵活和可维护的工具。相反,您可以使用系统代码来保存状态。这样,如果列发生更改 - 您无需更改DBUnit数据。为了确保您的测试不会彼此踩到脚趾,请使用data randomization。如果您可以在测试中启动并回滚事务,则使用系统代码可能会进一步帮助隔离。