DBUnit - Advertencia: AbstractTableMetaData
Pregunta
Estoy utilizando DbUnit en la última versión 2.4.8 y me da muchas advertencias en mis pruebas unitarias con este mensaje:
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.
Así que pensé que añadir (utilizo una base de datos MySQL):
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
}
Sin embargo, esto no ayuda a evitar estas advertencias. Lo que está mal aquí?
Gracias de antemano y Saludos cordiales Tim.
Solución
He resuelto esto con información de la DBUnit FAQ . Sólo estableciendo la propiedad de la fábrica tipo de datos hizo la advertencia desaparezca.
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());
Otros consejos
Primavera-Boot puede utilizar como frijol de configuración
@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;
}
}
Sé que esto es un hilo viejo, pero todas las respuestas aquí son más complicadas de lo que necesitan ser.
La forma más sencilla de lograr el establecimiento de la fábrica en cada adquisición conexión es a suministro un OperationListener
e implementar su connectionRetrieved
método para hacer lo que quiera. No se necesita Alteración temporal; el oyente se invoca cada vez que un IDatabaseConnection
se adquiere.
Yo estaba usando conductor jTDS y MS SQL 2008. En mi clase de anulación DBUntiTest el siguiente método. El mensaje Waring desapareció.
@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MsSqlDataTypeFactory());
}
@ de reensamblador en el clavo. Sólo añadir que estoy probando diferentes productos contra la base de datos, por lo que ahora establecido de fabrica Tipo de datos de acuerdo a la conexión actual:
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;
}
Usted, evidentemente, puede añadir cualquier base de datos adicionados a esta lista.