Java DbUnit-警告:AbstractTableMetaData

Java DbUnit-警告:AbstractTableMetaData,java,warnings,dbunit,Java,Warnings,Dbunit,我在最新版本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

我在最新版本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数据库):

但这无助于避免这些警告。这里怎么了


提前感谢您并向Tim致意。

我通过dbunit提供的信息解决了这个问题。只需设置数据类型工厂属性,警告就消失了

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

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

@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MsSqlDataTypeFactory());
}

我知道这是一条古老的线索,但这里所有的答案都比它们需要的更复杂


完成在每次连接获取时设置工厂的最简单方法是创建并实现其方法以执行您想要的操作。不需要压倒一切;每次获取
IDatabaseConnection
时,都会调用侦听器。

@重新组装器的答案是正确的。只需补充一点,我正在针对不同的数据库产品进行测试,因此我现在根据当前连接设置数据类型工厂:

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

显然,您可以将任何附加数据库添加到此列表。

使用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;
    }
}

我使用的是DBUnit2.7.0版。在我的例子中,仅仅在@Test中设置数据类型工厂属性是不够的。调用dbunit JdbcDatabaseTester.onsetup()方法时,警告将继续

我解决了实现扩展JdbdDatabaseTester的MyJdbcDatabaseTester并重写方法getConnection()、配置datatype factory属性的问题:

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

您是否尝试过“如果是,请通过论坛请求java类更新”路径?不,这是一个:MySqlDataTypeFactory。应该没问题,你能出示你的密码吗?你在哪里调用setUpDatabaseConfig?明白了!对于Mysql数据库,只需将最后一行中的
新OracleDataTypeFactory()
替换为
新的MySqlDataTypeFactory()
。提示:查找所有已知项以找到与您的数据库匹配的项。此答案中的所有链接都已失效。
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;
}