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的主要内容,如果未能解决你的问题,请参考以下文章