【问题标题】:DBUnit: how to change a property value correctly?DBUnit:如何正确更改属性值?
【发布时间】:2016-11-16 10:33:43
【问题描述】:

我想将属性 FEATURE_ALLOW_EMPTY_FIELDS 设置为 true 的 DBUnit (V2.5.3) 存在问题,但 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 属性...

【问题讨论】:

    标签: dbunit


    【解决方案1】:

    我注意到里面有一个 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());
    

    这样我们在生成连接之后和创建数据集之前覆盖配置。

    【讨论】:

      【解决方案2】:

      问题在于IDatabaseTester.getConnection() 似乎每次调用都会返回一个新的 IDatabaseConnection 对象。我认为这每次都会返回相同的连接对象。

      编辑

      @JavaDev1987:记住IDatabaseTester.getConnection()返回的对象。例如,使用以下代码代替我在问题中发布的代码:

      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(),因为这将创建并返回一个新的数据库连接(具有新的且未更改的默认配置)。这就是我写的。

      【讨论】:

      • 我知道,对!解决办法是什么?? @JavaDev1987 ...如果你发现了,请在这里发帖,我也会这样做
      • 我已将 cmets 添加到我的代码中。希望现在清楚我所说的“记忆”是什么意思。重要的是您使用 same dbConn 对象。如果您第二次调用 getConnection() 方法,您将获得一个新的(另一个!) DBConnection 对象,它有自己的配置。如果更改第一个 DBConnection 的配置,则另一个 DBConnection 对象的配置将保持不变(因为是第二个 DBConnection 的配置)。
      • @Nova:简要浏览了您的代码。真的看不出有什么问题,但我有一个提示:在构建 IDataSet 之前尝试设置配置值。如果这没有帮助,您应该为此创建一个新的 StackOverflow 问题(因为您的问题与我的问题不对应)
      • 会的,感谢您的宝贵时间。我仍然从您的解决方案中学到了东西。
      • 对于任何感兴趣的人,我已经发布了一个新问题here
      【解决方案3】:

      DatabaseTestCase 类中有一个名为 setUpDatabaseConfig() 的方法,所以我认为设置此属性的预期方法是将以下方法添加到您的类中:

          @Override
          protected void setUpDatabaseConfig(DatabaseConfig config) {
              config.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, true);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 2013-10-21
        • 2017-12-26
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        相关资源
        最近更新 更多