DbUnit - Предупреждение: AbstractTableMetaData
Я использую DbUnit в последней версии 2.4.8, и я получаю много предупреждений в своих модульных тестах с этим сообщением:
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());
}
Но это не поможет избежать этих предупреждений. Что здесь не так?
Спасибо заранее и с наилучшими пожеланиями Тим.
Ответы
Ответ 1
Я решил это с информацией из dbunit faq. Просто настройка свойства типа данных factory заставила предупреждение уйти.
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());
Ответ 2
Я знаю, что это старый поток, но все ответы здесь сложнее, чем они должны быть.
Самый простой способ выполнить настройку factory при каждом подключении - поставка OperationListener
и реализовать свой connectionRetrieved
, чтобы делать то, что вы хотите. Не требуется переопределения; слушатель будет вызываться каждый раз при получении IDatabaseConnection
.
Ответ 3
Я использовал драйвер JTDS и MS SQL 2008. В моем классе DBUntiTest переопределить следующий метод. Хранимое сообщение исчезло.
@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MsSqlDataTypeFactory());
}
Ответ 4
С 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;
}
}
Ответ 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;
}
В этот список можно добавить дополнительные базы данных.