Java DBUnit在删除数据集时引发NoSuchColumnException
我正在使用DBUnit进行一些单元测试。我能够从xml文件中正确插入数据集,但无法在完成所有操作后清除数据集 下面是我的ID列的表模式(我在这里输入了其他列): 以下是XML数据集:Java DBUnit在删除数据集时引发NoSuchColumnException,java,junit,dbunit,Java,Junit,Dbunit,我正在使用DBUnit进行一些单元测试。我能够从xml文件中正确插入数据集,但无法在完成所有操作后清除数据集 下面是我的ID列的表模式(我在这里输入了其他列): 以下是XML数据集: <dataset> <MY_TABLE NAME="NISAY" /> </dataset> 为了测试每件事是否正确,我从ID列中删除了unsigned约束,并使用了以下数据集: <dataset> <MY_TABLE ID="-99" NAM
<dataset>
<MY_TABLE NAME="NISAY" />
</dataset>
为了测试每件事是否正确,我从ID列中删除了unsigned
约束,并使用了以下数据集:
<dataset>
<MY_TABLE ID="-99" NAME="NISAY" />
</dataset>
使用上述方法,一切都很顺利。但是,ID必须是无符号的。如何告诉DBUnit在删除时忽略主键?我尝试使用过滤器,但不确定它们是否配置正确。好的,所以问题是您不能在XML文件中提供ID,因为ID必须自动生成。DBUnit根据主键删除行。由于我没有提供主键(即ID),DBUnit无法删除数据集 解决方案: 为数据集创建一个伪主键。 第一个机具
IColumnFilter
class MyPrimaryKeyFilter implements IColumnFilter {
private String pseudoKey = null;
MyPrimaryKeyFilter(String pseudoKey) {
this.pseudoKey = pseudoKey;
}
public boolean accept(String tableName, Column column) {
return column.getColumnName().equalsIgnoreCase(pseudoKey);
}
}
然后设置属性\u主键\u过滤器
,如下所示:
DatabaseConfig config = iConnection.getConfig();
config.setProperty(DatabaseConfig.PROPERTY_PRIMARY_KEY_FILTER, new MyPrimaryKeyFilter("SOME_OTHER_COLUMN_TO_BE_TREATED_AS_PK"));
现在,列
SOME\u OTHER\u column\u TO\u BE\u TREATED\u AS\u PK
将被视为主键,您可以在数据集XML文件中为该列提供任何值。对于具有自定义数据类型的特定列,我遇到了相同的错误(NoSuchColumnException)(已使用DatabaseConfig.PROPERTY\u DATATYPE\u工厂,新的OracleDataTypeFactory()
正在使用以下内容提取数据集:
IDatabaseTester databaseTester =new JdbcDatabaseTester("oracle.jdbc.driver.OracleDriver",
address, "user", "password", "schema");
QueryDataSet queryDataSet = new QueryDataSet(databaseTester.getConnection());
String query = "SELECT * FROM CARS WHERE ID LIKE '123456'";
queryDataSet.addTable("FACTORY.CARS", query);
上述数据集用于:
DatabaseOperation.DELETE.execute(connection, queryDataSet);
通过将查询更改为仅返回标识要删除的行所需的列(避免使用自定义数据类型的行)来解决此问题,异常停止:
String query = "SELECT CAR_ID FROM CARS WHERE LICENSE_PLATE LIKE 'AB-FV-XY'";
DatabaseOperation.DELETE.execute(connection, queryDataSet);
String query = "SELECT CAR_ID FROM CARS WHERE LICENSE_PLATE LIKE 'AB-FV-XY'";