19

我在最新版本 2.4.8 中使用 DbUnit,并且在单元测试中收到许多警告,并显示以下消息:

WARN : org.dbunit.dataset.AbstractTableMetaData - 
Potential problem found: The configured data type factory 
    'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' 
     might cause problems with the current database 'MySQL' (e.g. some datatypes may 
     not be supported properly). In rare cases you might see this message because the 
     list of supported database products is incomplete (list=[derby]). If so please 
     request a java-class update via the forums.If you are using your own 
     IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override 
     getValidDbProducts() to specify the supported database products.

所以我想我添加这个(我使用 MySQL 数据库):

protected void setUpDatabaseConfig(DatabaseConfig config) {
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
}

但这无助于避免这些警告。这里有什么问题?

提前谢谢你和最好的问候蒂姆。

4

6 回答 6

34

我用来自 dbunit faq的信息解决了这个问题。只需设置数据类型工厂属性,警告就会消失。

    Connection dbConn = template.getDataSource().getConnection();

    IDatabaseConnection connection = new DatabaseConnection(dbConn, "UTEST", false);

    DatabaseConfig dbConfig = connection.getConfig();

    // added this line to get rid of the warning
    dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory());
于 2011-05-06T15:49:07.250 回答
9

使用Spring-Boot,您可以使用这样的配置 bean

@Configuration
public class DbUnitConfiguration {

@Autowired
private DataSource dataSource;

@Bean
public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection() {
    DatabaseConfigBean bean = new DatabaseConfigBean();
    bean.setDatatypeFactory(new MySqlDataTypeFactory());

    DatabaseDataSourceConnectionFactoryBean dbConnectionFactory = new DatabaseDataSourceConnectionFactoryBean(dataSource);
    dbConnectionFactory.setDatabaseConfig(bean);
    return dbConnectionFactory;
    }
}
于 2017-03-29T15:27:03.143 回答
4

我知道这是一个旧线程,但这里的所有答案都比他们需要的复杂。

在每次连接获取上完成设置工厂的最简单方法是提供OperationListener实现它的connectionRetrieved方法来做你想做的事。无需覆盖;每次IDatabaseConnection获取 an 时都会调用侦听器。

于 2014-02-10T19:20:20.867 回答
3

我使用的是 JTDS 驱动程序和 MS SQL 2008。在我的 DBUntiTest 类中覆盖以下方法。警告信息消失了。

@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MsSqlDataTypeFactory());
}
于 2012-05-19T22:16:57.283 回答
1

@reassembler 的答案是正确的。补充一点,我正在针对不同的数据库产品进行测试,所以我现在根据当前连接设置 DataType Factory:

private IDatabaseConnection getConnection(Connection jdbcConnection) throws Exception {
    String databaseProductName = jdbcConnection.getMetaData().getDatabaseProductName();

    DatabaseConnection databaseConnection = new DatabaseConnection(jdbcConnection);
    DatabaseConfig dbConfig = databaseConnection.getConfig();

    switch (databaseProductName) {
    case "HSQL Database Engine":
        dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
        break;
    case "MySQL":
        dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
        break;
    default:
        log.warn("No matching database product found when setting DBUnit DATATYPE_FACTORY");
    }

    return databaseConnection; 
}

您显然可以将任何其他数据库添加到此列表中。

于 2014-09-04T08:29:33.687 回答
0

我正在使用 Dbunit 2.7.0 版。就我而言,仅在 @Test 中设置数据类型工厂属性是不够的。调用 dbunit JdbcDatabaseTester.onsetup() 方法时警告继续。

我解决了实现扩展 JdbdDatabaseTester 的 MyJdbcDatabaseTester 并覆盖方法 getConnection()、配置数据类型工厂属性的问题:

public class MyJdbcDatabaseTester extends JdbcDatabaseTester {

public MyJdbcDatabaseTester(String driverClass, String connectionUrl, String username,
                            String password )
        throws ClassNotFoundException {
    super( driverClass, connectionUrl, username, password );
}

@Override
public IDatabaseConnection getConnection() throws Exception {
    IDatabaseConnection result = super.getConnection();
    DatabaseConfig dbConfig = result.getConfig();
    //to supress warnings when accesing to database
    dbConfig.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
    return result;
}

}

然后我在测试中使用 MyJcbdDatabaseTester 而不是 JdbcDatabaseTester

于 2021-04-09T16:20:55.223 回答