Unitils在集成DBunit時,如果數據庫是mysql時,就會出現一些如下:
org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method......
org.dbunit.dataset.NoSuchColumnException......
出現如上兩個報錯的原因是:unitils默認使用的是“DefaultMetadataHandler.java”這個類去加載數據庫信息,從而得不到數據庫schema的值,DefaultMetadataHandler.java中的實現代碼如下:
boolean areEqual = areEqualIgnoreNull(catalog, catalogName, caseSensitive) && areEqualIgnoreNull(schema, schemaName, caseSensitive) && areEqualIgnoreNull(table, tableName, caseSensitive) && areEqualIgnoreNull(column, columnName, caseSensitive);
這個時候的schemaName是空的,但是傳進來的schema是有值的,從而報錯!
解決方案兩種:
1、改源代碼,去掉catalog和schema的比較
2、寫一個拓展類,去繼承DbUnitModule,代碼如下:
import org.dbunit.database.DatabaseConfig; import org.dbunit.ext.mysql.MySqlDataTypeFactory; import org.dbunit.ext.mysql.MySqlMetadataHandler; import org.unitils.dbunit.DbUnitModule; import org.unitils.dbunit.util.DbUnitDatabaseConnection; public class MySqlDbUnitModule extends DbUnitModule { @Override public DbUnitDatabaseConnection getDbUnitDatabaseConnection( final String schemaName) { DbUnitDatabaseConnection result = dbUnitDatabaseConnections .get(schemaName); if (null != result) { return result; } result = super.getDbUnitDatabaseConnection(schemaName); result.getConfig().setProperty( DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory()); result.getConfig().setProperty( DatabaseConfig.PROPERTY_METADATA_HANDLER, new MySqlMetadataHandler()); return result; } }
然后修改unitils-core的jar包下的unitils-default.properties文件,
unitils.module.dbunit.className=org.unitils.dbunit.DbUnitModule 更改為如下:
unitils.module.dbunit.className=org.unitils.dbunit.MySqlDbUnitModule
如果你使用自己定義的配置文件unitils.properties,則只需要修改自定義配置文件即可,就可以不需要修改jar中的unitils-default.properties
當然出現這些問題的前提是所用數據庫是mysql的情況下,以及解決方案~
