DbUnit - 警告:AbstractTableMetaData

Posted

技术标签:

【中文标题】DbUnit - 警告:AbstractTableMetaData【英文标题】:DbUnit - Warning: AbstractTableMetaData 【发布时间】:2011-04-25 23:18:49 【问题描述】:

我在最新版本 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());

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

在此先感谢您并向蒂姆致以最诚挚的问候。

【问题讨论】:

您是否尝试过“如果有,请通过论坛请求 Java 类更新”路径? 不,就是这个:MySqlDataTypeFactory。应该没问题的。 你能展示你的代码吗?你在哪里调用 setUpDatabaseConfig? 【参考方案1】:

我使用来自 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());

【讨论】:

知道了!对于 Mysql 数据库,只需将最后一行中的 new OracleDataTypeFactory() 替换为 new MySqlDataTypeFactory() 提示:查看所有已知的implementing classes 以找到与您的数据库匹配的那个。【参考方案2】:

通过 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;
    

【讨论】:

DbUnitTestExecutionListener 提到 COMMON_DATABASE_CONNECTION_BEAN_NAMES = "dbUnitDatabaseConnection", "dataSource" ; 所以 bean 的名称很重要!【参考方案3】:

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

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

【讨论】:

此答案中的所有链接都已失效。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

我使用的是 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

【讨论】:

以上是关于DbUnit - 警告:AbstractTableMetaData的主要内容,如果未能解决你的问题,请参考以下文章

DBUnit 中的日志输出

DbUnit:NoSuchColumnException 和区分大小写

依赖数据库的单元测试——DBUnit

DBUnit使用案例

DBUnit 有没有办法自动创建表?

将 DbUnit 与没有主键的表一起使用