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的情况下,以及解决方案~ |