【发布时间】:2017-05-19 04:41:35
【问题描述】:
我在下面包含了完全可测试的代码,当提供包含空字段的数据集xml 时会生成以下错误。下面还有一个示例dataset.xml。
java.lang.IllegalArgumentException: table.column=places.CITY 值为 为空但必须包含一个值(要禁用此功能检查,请设置 DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS 为真)
线程here 相似但不同,因为它使用多个dbTester.getConnection() 而我的代码只使用一个,但有相同的错误。主要问题与这条线有关databaseConfig.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_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>
代码:
import org.dbunit.IDatabaseTester;
import org.dbunit.JdbcDatabaseTester;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DBConnectionIT {
IDatabaseTester databaseTester = null;
IDatabaseConnection iConn = null;
Connection connection = null;
@Before
public void init() throws Exception {
databaseTester = new JdbcDatabaseTester(org.hsqldb.jdbcDriver.class.getName(), "jdbc:hsqldb:mem:testdb;sql.syntax_pgs=true", "sa", "");
iConn = databaseTester.getConnection();
DatabaseConfig databaseConfig = iConn.getConfig();
databaseConfig.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, Boolean.TRUE);
connection = iConn.getConnection();
createTable(connection);
IDataSet dataSet = new FlatXmlDataSetBuilder().build(new File("dataset.xml"));
databaseTester.setDataSet(dataSet);
databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT);
databaseTester.setTearDownOperation(DatabaseOperation.DELETE_ALL);
databaseTester.onSetup();
}
@Test
public void testDBUnit() {
try {
PreparedStatement pst = connection.prepareStatement("select * from places");
ResultSet rs = pst.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void createTable(Connection conn) throws Exception {
PreparedStatement pp = conn.prepareStatement(
"CREATE TABLE PLACES" +
"(address VARCHAR(255), " +
"city TEXT, " +
"id VARCHAR(255) NOT NULL primary key)");
pp.executeUpdate();
pp.close();
}
}
编辑(基于 César Rodríguez 的回答):
我现在在父类中重构了这个方法:
protected void setUpDatabaseConfig(DatabaseConfig databaseConfig) {
databaseConfig.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, Boolean.TRUE);
}
并创建了一个子类@Overrides这个方法,但它说这个子类没有被使用。如何在父类中解决这个类(DBConnectionOverride),以解决我的问题?
class DBConnectionOverride extends DBConnectionIT {
@Override
protected void setUpDatabaseConfig(DatabaseConfig databaseConfig) {
databaseConfig.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
}
}
【问题讨论】:
-
仔细查看您链接到的问题。设置 FEATURE_ALLOW_EMPTY_FIELDS 属性后,您似乎需要使用 iConn 作为连接。似乎不需要调用 iConn.getConnection()。
-
@fredt,感谢您的反馈。我很困惑为什么你会说
No call to iConn.getConnection() seems to be required,因为准备好的语句需要Connection而不是IDatabaseConnection。如果我只是在这些准备语句中传入IDatabaseConnection.getConnection(),它会返回相同的错误。您能否将您的建议落实到我提供的代码库中?我完全不知所措 -
总是这行导致错误:
databaseTester.onSetup(); -
@Nova 我不能用你的例子。我只是为你提供我的方式。
标签: postgresql unit-testing integration-testing hsqldb dbunit