2010-10-15 10 views
14

Ich verwende DbUnit in der aktuellen Version 2.4.8 und ich viele Warnungen in meinen Unit-Tests mit dieser Meldung:DbUnit - Achtung: 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. 

Also dachte ich, ich dieses Add (ich ein MySQL Datenbank):

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

Aber das hilft nicht, diese Warnungen zu vermeiden. Was ist hier falsch?

Vielen Dank im Voraus & Mit freundlichen Grüßen Tim.

+0

Haben Sie versucht, verwenden können: „Wenn so fordern Sie bitte eine Java-Klasse-Update über den Foren“ Weg? –

+0

Nein, das ist dieser: MySqlDataTypeFactory. Es sollte in Ordnung sein. – Tim

+0

Können Sie Ihren Code zeigen? Wo rufst du setUpDatabaseConfig auf? – Frans

Antwort

28

Ich löste dies mit Informationen aus dem dbunit faq. Durch einfaches Setzen der Factory-Eigenschaft des Datentyps wurde die Warnung gelöscht.

+0

Spot auf, danke! – stantonk

+4

Verstanden! Ersetzen Sie für die Mysql-Datenbank einfach die 'neue OracleDataTypeFactory()' in der letzten Zeile durch 'new MySqlDataTypeFactory()'. –

+1

Tipp: Sehen Sie sich alle bekannten [implementierenden Klassen] (http://dbunit.sourceforge.net/apidocs/org/dbunit/dataset/datatype/IDataTypeFactory.html) an, um diejenige zu finden, die Ihrer Datenbank entspricht. – Laimoncijus

3

Ich verwendete JTDS-Treiber und MS SQL 2008. Überschreiben Sie in meiner DBUntiTest-Klasse die folgende Methode. Die waring Nachricht verschwand.

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

Ich weiß, das ist ein alter Thread, aber alle Antworten hier sind komplizierter als sie sein müssen.

Der einfachste Weg, die Werkseinstellung bei jeder Verbindungsaufnahme zu erreichen, ist supply ein OperationListener und implementieren Sie seine connectionRetrieved Methode, um zu tun, was Sie wollen. Kein Überschreiben erforderlich; Der Listener wird jedes Mal aufgerufen, wenn eine IDatabaseConnection erfasst wird.

+0

Alle Links in dieser Antwort sind tot. – Stephan

+0

Problem behoben; Vielen Dank! –

+0

connectionAcquired scheint entfernt zu werden ... – Stephan

1

@ reassembler's Antwort ist genau richtig. Nur hinzufügen, dass ich gegen verschiedene Datenbankprodukte mich entschieden, so dass ich setze jetzt die Datatype-Fabrik nach der aktuellen Verbindung:

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; 
} 

Sie offensichtlich keine Additionaly Datenbanken zu dieser Liste hinzufügen kann.

3

Mit Frühlings-Boot Sie eine solche Konfiguration 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; 
    } 
}