Postgresql 设置IDatabaseConnection(HSQLDB)的数据库配置属性时出错
我在下面包含了完全可测试的代码,当提供包含空字段的数据集Postgresql 设置IDatabaseConnection(HSQLDB)的数据库配置属性时出错,postgresql,unit-testing,integration-testing,hsqldb,dbunit,Postgresql,Unit Testing,Integration Testing,Hsqldb,Dbunit,我在下面包含了完全可测试的代码,当提供包含空字段的数据集xml时,会产生以下错误。下面还有一个示例dataset.xml java.lang.IllegalArgumentException:table.column=places.CITY值为 空,但必须包含一个值(要禁用此功能检查,请设置 DatabaseConfig.FEATURE_允许_空_字段为true) 该线程类似,但不同,因为它使用多个dbTester.getConnection(),而我的代码只使用一个,但有相同的错误。主要问题与
xml
时,会产生以下错误。下面还有一个示例dataset.xml
java.lang.IllegalArgumentException:table.column=places.CITY值为
空,但必须包含一个值(要禁用此功能检查,请设置
DatabaseConfig.FEATURE_允许_空_字段为true)
该线程类似,但不同,因为它使用多个dbTester.getConnection()
,而我的代码只使用一个,但有相同的错误。主要问题与此行有关databaseConfig.setProperty(databaseConfig.FEATURE\u ALLOW\u EMPTY\u FIELDS,Boolean.TRUE)代码>
这似乎被完全忽视了。我已尝试将init
代码放入@Test
方法中,但错误仍然存在
dataset.xml
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<places address="123 Up Street" city="Chicago" id="001"/>
<places address="456 Down Street" city="" id="002"/>
<places address="789 Right Street" city="Boston" id="003"/>
</dataset>
编辑(根据塞萨尔·罗德里格斯的回答):
我现在在父类中重构了此方法:
protected void setUpDatabaseConfig(DatabaseConfig databaseConfig) {
databaseConfig.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, Boolean.TRUE);
}
创建了一个子类,它覆盖了这个方法,但它说这个子类没有被使用。如何在父类中处理这个类(DBConnectionOverride),以解决我的问题
class DBConnectionOverride extends DBConnectionIT {
@Override
protected void setUpDatabaseConfig(DatabaseConfig databaseConfig) {
databaseConfig.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
}
}
您必须重写方法setUpDatabaseConfig(DatabaseConfig config),如下所示:
@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
}
希望对我有帮助,这是工作:
IDatabaseConnection dbConn = new DatabaseDataSourceConnection(getDataSource());
dbConn.getConfig().setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
DatabaseOperation.CLEAN_INSERT.execute(dbConn, getiDataSet(loadDBData.source()));
我偶然发现了正确的答案,至少解决了我的问题。它始终与这一行相关databaseTester.onSetup()
,可以简单地用DatabaseOperation.CLEAN\u INSERT.execute(iConn,dataSet)替换它代码>。请随意评论为什么这似乎修复了错误。仔细查看您链接的问题。在设置FEATURE_ALLOW_EMPTY_FIELDS属性之后,似乎需要使用iConn作为连接。似乎不需要调用iConn.getConnection()。@fredt,感谢您的反馈。我不明白为什么您会说,似乎不需要调用iConn.getConnection()
,因为准备好的语句需要连接
而不是IDatabaseConnection
。如果我只是在那些prepare语句中传入IDatabaseConnection.getConnection()
,它将返回相同的错误。您能将您的建议实现到我提供的代码库中吗?我完全不知所措,总是这一行导致错误:databaseTester.onSetup()代码>@Nova我不能用你的例子。我只是给你指路。谢谢@César,但我不知道该把这个@覆盖放在哪里。你能用我提供的代码告诉我最终的代码应该是什么样子吗?我提取了行databaseConfig.setProperty(databaseConfig.FEATURE\u ALLOW\u EMPTY\u字段,Boolean.TRUE)将code>放入代码建议的方法中,然后我将您的@Override
方法放入子类中,但它告诉我我的子类(我将其命名为DBConnectionOverride)没有在任何地方使用。我编辑了我的问题来展示这个。。。怎么了?我想您可以将覆盖方法放在DBConnectionIT
类中。无论如何,如果要创建一个新类,如DBConnectionOverride
,则该类不应扩展DBConnectionIT
类。扩展DBConnectionOverride
的类是dbconnectionOnOverride
不起作用的,如果超类扩展子类,则@Override
方法返回此错误方法不从其超类重写方法。如果子类扩展了超类,则此错误将消失,但是子类将变灰(未使用)。如果您可以使用我在问题中提供的代码使其工作,然后在此处共享,我将奖励您+1。我似乎完全没有使用覆盖
,就解决了自己的问题。无论如何,谢谢。当使用DatabaseOperation.CLEAN\u INSERT.execute(iConn,dataSet)时,我无法重现您的结果代码>在我的上下文中。您是否能够使用我提供的代码库提供解决方案?如果是的话,我会给你打勾。谢谢导致错误的总是这一行:databaseTester.onSetup()代码>你有没有再看这个?我可以在日志中看到,DbUnit获得了一个iConn,并将配置设置为FEATURE\u ALLOW\u EMPTY\u FIELDS
=true,但随后将其与其他几个功能一起初始化为false。在我看来这是一个bug,但如果这对您有效,我的分析就没有意义了……我将错误跟踪到了DataSourceDatabaseTester
,它在每个getConnection()
调用上实例化了一个新的数据库连接,如果您调用DatabaseTester.onSetup()
,它将被提供一个新的DatabaseConnection
实例,该实例在构造函数中为自己创建一个新的DatabaseConfig
实例,从而忽略您使用ALLOW\u EMPTY\u字段初始化的任何DatabaseConfig
实例。缺陷不确定。显然,从未以这种方式进行配置。此配置的唯一位置是在DbUnit的Ant相关代码中使用的。我想我必须访问dbunit用户ML。
IDatabaseConnection dbConn = new DatabaseDataSourceConnection(getDataSource());
dbConn.getConfig().setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
DatabaseOperation.CLEAN_INSERT.execute(dbConn, getiDataSet(loadDBData.source()));