java - DbUnit-Advertencia: AbstractTableMetaData
warnings (5)
Estoy usando DbUnit en la última versión 2.4.8 y recibo muchas advertencias en mis pruebas de unidad 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 agregué esto (uso una base de datos MySQL):
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
}
Pero esto no ayuda a evitar estas advertencias. ¿Qué está mal aquí?
Gracias de antemano y saludos cordiales Tim.
Con Spring-Boot puedes usar este bean 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;
}
}
Estaba usando el controlador JTDS y MS SQL 2008. En mi clase DBUntiTest, anulo el siguiente método. El mensaje de guerra desapareció.
@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MsSqlDataTypeFactory());
}
La respuesta de @ reensamblador es acertada. Solo para agregar que estoy probando con diferentes productos de base de datos, ahora configuro DataType Factory de acuerdo con 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;
}
Obviamente, puede agregar cualquier base de datos adicional a esta lista.
Resolví esto con información de las preguntas frecuentes de dbunit. Con solo establecer el tipo de datos propiedad de fábrica, la advertencia desaparece.
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());
Sé que este es un hilo viejo, pero todas las respuestas aquí son más complicadas de lo que deberían ser.
La forma más sencilla de realizar la configuración de fábrica en cada adquisición de conexión es supply un OperationListener
e implementar su método ConnectionRetrieved para hacer lo que quiera. No es necesario anular; el escucha se invocará cada vez que se IDatabaseConnection
una IDatabaseConnection
.