DBUnit:如何正确更改 属性 值?
DBUnit: how to change a property value correctly?
我遇到了 DBUnit (V2.5.3) 的问题,我想将 属性 FEATURE_ALLOW_EMPTY_FIELDS
设置为 true
但 DBUnit 忽略了此设置。我设置 属性 的代码是:
DatabaseConfig dbCfg = null;
try {
dbCfg = dbTester.getConnection().getConfig();
dbCfg.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, Boolean.TRUE);
System.out.println("getCfg -> " + dbTester.getConnection().getConfig().getProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS));
System.out.println("dbCfg -> " + dbCfg.getProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS));
} catch (Exception exc) {
exc.printStackTrace();
}
我认为问题在于新值仅设置到 dbCfg
对象。但似乎 DBUnit 没有使用这个对象,因为上面代码的输出是:
getCfg -> false
dbCfg -> true
看来我太笨了,无法理解如何正确设置 DBUnit 属性 ...
问题是 IDatabaseTester.getConnection()
似乎 return 每次调用一个新的 IDatabaseConnection 对象。我认为这 returns 每次都是相同的连接对象。
编辑
@JavaDev1987:记住 IDatabaseTester.getConnection()
编辑的对象 return。在示例中,使用以下代码代替我在问题中 post 的代码:
IDatebaseConnection dbConn = null;
DatabaseConfig dbCfg = null;
try {
dbConn = dbTester.getConnection(); // <-- get DBConnection
dbCfg = dbConn.getConfig(); // use dbConn instead calling 'dbTester.getConnection()'
dbCfg.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, Boolean.TRUE);
// in next line: use here also dbConn instead calling 'dbTester.getConnection()'
System.out.println("getCfg -> " + dbConn.getConfig().getProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS));
System.out.println("dbCfg -> " + dbCfg.getProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS));
} catch (Exception exc) {
exc.printStackTrace();
}
重要的是您不要再次调用 dbTester.getConnection()
,因为这将创建并 return 一个新的数据库连接(具有新的且未更改的默认配置)。这就是我写的。
我注意到里面有个OperationListener,是在Connection对象生成后触发的。这是我所做的:我添加了一个 CustomConfigurationOperationListener:
public class CustomConfigurationOperationListener extends DefaultOperationListener implements IOperationListener{
@Override
public void connectionRetrieved(IDatabaseConnection iDatabaseConnection) {
super.connectionRetrieved(iDatabaseConnection);
iDatabaseConnection.getConfig().setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
}
}
然后在dbTester上设置:
dbTester.setOperationListener(new CustomConfigurationOperationListener());
这样我们就可以在生成连接之后和创建数据集之前覆盖配置。
DatabaseTestCase
class 中有一个名为 setUpDatabaseConfig()
的方法,因此我相信设置此 属性 的预期方法是将以下方法添加到您的class:
@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
}
我遇到了 DBUnit (V2.5.3) 的问题,我想将 属性 FEATURE_ALLOW_EMPTY_FIELDS
设置为 true
但 DBUnit 忽略了此设置。我设置 属性 的代码是:
DatabaseConfig dbCfg = null;
try {
dbCfg = dbTester.getConnection().getConfig();
dbCfg.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, Boolean.TRUE);
System.out.println("getCfg -> " + dbTester.getConnection().getConfig().getProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS));
System.out.println("dbCfg -> " + dbCfg.getProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS));
} catch (Exception exc) {
exc.printStackTrace();
}
我认为问题在于新值仅设置到 dbCfg
对象。但似乎 DBUnit 没有使用这个对象,因为上面代码的输出是:
getCfg -> false
dbCfg -> true
看来我太笨了,无法理解如何正确设置 DBUnit 属性 ...
问题是 IDatabaseTester.getConnection()
似乎 return 每次调用一个新的 IDatabaseConnection 对象。我认为这 returns 每次都是相同的连接对象。
编辑
@JavaDev1987:记住 IDatabaseTester.getConnection()
编辑的对象 return。在示例中,使用以下代码代替我在问题中 post 的代码:
IDatebaseConnection dbConn = null;
DatabaseConfig dbCfg = null;
try {
dbConn = dbTester.getConnection(); // <-- get DBConnection
dbCfg = dbConn.getConfig(); // use dbConn instead calling 'dbTester.getConnection()'
dbCfg.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, Boolean.TRUE);
// in next line: use here also dbConn instead calling 'dbTester.getConnection()'
System.out.println("getCfg -> " + dbConn.getConfig().getProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS));
System.out.println("dbCfg -> " + dbCfg.getProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS));
} catch (Exception exc) {
exc.printStackTrace();
}
重要的是您不要再次调用 dbTester.getConnection()
,因为这将创建并 return 一个新的数据库连接(具有新的且未更改的默认配置)。这就是我写的。
我注意到里面有个OperationListener,是在Connection对象生成后触发的。这是我所做的:我添加了一个 CustomConfigurationOperationListener:
public class CustomConfigurationOperationListener extends DefaultOperationListener implements IOperationListener{
@Override
public void connectionRetrieved(IDatabaseConnection iDatabaseConnection) {
super.connectionRetrieved(iDatabaseConnection);
iDatabaseConnection.getConfig().setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
}
}
然后在dbTester上设置:
dbTester.setOperationListener(new CustomConfigurationOperationListener());
这样我们就可以在生成连接之后和创建数据集之前覆盖配置。
DatabaseTestCase
class 中有一个名为 setUpDatabaseConfig()
的方法,因此我相信设置此 属性 的预期方法是将以下方法添加到您的class:
@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
}