2010-10-15 16 views
14

estoy usando DbUnit en la última versión 2.4.8 y me da muchas advertencias en mis pruebas unitarias con este mensaje:DbUnit - Advertencia: AbstractTableMetaData

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 un MySQL base de datos):

protected void setUpDatabaseConfig(DatabaseConfig config) { 
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory()); 
} 

Pero esto no ayuda a evitar estas advertencias. ¿Qué pasa aquí?

Gracias de antemano & Saludos cordiales Tim.

+0

¿Has probado el camino "Si es así por favor solicite una actualización de clase Java a través de los foros"? –

+0

No, esa es esta: MySqlDataTypeFactory. Debería estar bien. – Tim

+0

¿Puedes mostrar tu código? ¿A dónde llamas a setUpDatabaseConfig? – Frans

Respuesta

28

Lo resolví con información del dbunit faq. El solo hecho de establecer la propiedad de fábrica del tipo de datos hizo que la advertencia desapareciera.

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()); 
+0

lugar, gracias! – stantonk

+4

¡Entendido! Para la base de datos Mysql, simplemente reemplace el 'nuevo OracleDataTypeFactory()' en la última línea por 'new MySqlDataTypeFactory()'. –

+1

Consejo: Consulte todas las [clases de implementación] conocidas (http://dbunit.sourceforge.net/apidocs/org/dbunit/dataset/datatype/IDataTypeFactory.html) para encontrar la que coincida con su base de datos. – Laimoncijus

3

que estaba usando conductor jTDS y MS SQL 2008. En mi clase DBUntiTest anular el siguiente método. El mensaje de advertencia desapareció.

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

Sé que este es un hilo antiguo, pero todas las respuestas aquí son más complicadas de lo que deben ser.

La forma más sencilla de lograr establecer la fábrica en cada adquisición de conexión es supply y OperationListener e implementar su método connectionRetrieved para hacer lo que desee. No se necesita anulación; el oyente se invocará cada vez que se adquiera IDatabaseConnection.

+0

Todos los enlaces en esta respuesta están muertos. – Stephan

+0

Solucionado; ¡Gracias! –

+0

connectionAcquired parece ser eliminado ... – Stephan

1

@ La respuesta de Reensamblador es perfecta. Sólo añadir que estoy probando diferentes productos contra la base de datos, por lo que ahora establecer la fábrica 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; 
} 

es obvio que puede añadir cualquier base de datos adicionados a esta lista.

3

Con Primavera-Boot puede utilizar como grano 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; 
    } 
}