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);
    }