Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DBUnit在删除数据集时引发NoSuchColumnException_Java_Junit_Dbunit - Fatal编程技术网

Java DBUnit在删除数据集时引发NoSuchColumnException

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

我正在使用DBUnit进行一些单元测试。我能够从xml文件中正确插入数据集,但无法在完成所有操作后清除数据集

下面是我的ID列的表模式(我在这里输入了其他列):

以下是XML数据集:

<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'";