`
技术无涯苦作舟
  • 浏览: 12111 次
社区版块
存档分类
最新评论

unitils集成dbunit与MySQL的NoSuchColumnException问题

阅读更多
在使用unitils集成dbunit与MySQL做单元测试的时候总是出现NoSuchColumnException,导致测试无法完成。具体错误信息如下:
org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method public void com.smart.dao.UserDaoTest.findUserByUserName()

	at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:190)
	at org.unitils.dbunit.DbUnitModule$DbUnitListener.beforeTestSetUp(DbUnitModule.java:791)
	at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:273)
	at org.unitils.UnitilsTestNG.unitilsBeforeTestSetUp(UnitilsTestNG.java:62)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
	at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
	at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:653)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
	at org.testng.TestRunner.privateRun(TestRunner.java:767)
	at org.testng.TestRunner.run(TestRunner.java:617)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
	at org.testng.SuiteRunner.run(SuiteRunner.java:240)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
	at org.testng.TestNG.run(TestNG.java:1057)
	at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
	at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:127)
Caused by: org.unitils.core.UnitilsException: Error while executing DataSetLoadStrategy
	at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:46)
	at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:342)
	at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:268)
	at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:187)
	... 28 more
Caused by: org.dbunit.dataset.NoSuchColumnException:  (Non-uppercase input column: user_id) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.
	at org.dbunit.dataset.AbstractTableMetaData.getColumnIndex(AbstractTableMetaData.java:117)
	at org.dbunit.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:89)
	at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:144)
	at org.unitils.dbunit.datasetloadstrategy.impl.InsertLoadStrategy.doExecute(InsertLoadStrategy.java:45)
	at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:44)
	... 31 more


再理下错误信息:

    org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method

    Caused by: org.unitils.core.UnitilsException: Error while executing DataSetLoadStrategy

    Caused by: org.dbunit.dataset.NoSuchColumnException:


如果把log4j设为DEBUG, 在控制台可以发现在报错之前有如下信息:
2017-09-30 09:02:40,265 DEBUG (org.unitils.core.util.ConfigUtils:74) - Creating instance of interface org.dbunit.dataset.datatype.IDataTypeFactory. Implementation class org.dbunit.ext.mysql.MySqlDataTypeFactory
2017-09-30 09:02:40,265 DEBUG (org.unitils.core.util.ConfigUtils:74) - Creating instance of interface org.dbunit.dataset.datatype.IDataTypeFactory. Implementation class org.dbunit.ext.mysql.MySqlDataTypeFactory
2017-09-30 09:02:40,285 DEBUG (org.unitils.core.util.ConfigUtils:74) - Creating instance of interface org.dbunit.database.IMetadataHandler. Implementation class org.dbunit.database.DefaultMetadataHandler
2017-09-30 09:02:40,285 DEBUG (org.unitils.core.util.ConfigUtils:74) - Creating instance of interface org.dbunit.database.IMetadataHandler. Implementation class org.dbunit.database.DefaultMetadataHandler
2017-09-30 09:02:40,335 DEBUG (org.springframework.jdbc.datasource.DataSourceUtils:110) - Fetching JDBC Connection from DataSource
2017-09-30 09:02:40,335 DEBUG (org.springframework.jdbc.datasource.DataSourceUtils:110) - Fetching JDBC Connection from DataSource
2017-09-30 09:02:40,365 DEBUG (org.springframework.jdbc.datasource.DataSourceUtils:327) - Returning JDBC Connection to DataSource
2017-09-30 09:02:40,365 DEBUG (org.springframework.jdbc.datasource.DataSourceUtils:327) - Returning JDBC Connection to DataSource


这里基本可确定是在加载数据库信息的时候报错,而对应的类是DefaultMetadataHandler. 看看如下源码部分:
boolean areEqual = this.areEqualIgnoreNull(catalog, catalogName, caseSensitive) && this.areEqualIgnoreNull(schema, schemaName, caseSensitive) && this.areEqualIgnoreNull(table, tableName, caseSensitive) && this.areEqualIgnoreNull(column, columnName, caseSensitive);
        return areEqual;


DEBUG的时候发现这里的输入如下:



可确定传入的schema是有值的,而schemaName为null,导致areEqual为false,进而报错。

解决办法:重写DbUnitModule的getDbUnitDatabaseConnection方法,
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.properties文件中引用:
unitils.module.dbunit.className=org.dbunit.MySqlDbUnitModule

至此问题解决。

总结,仔细看log4j的日志肯定会发现此问题的,我在此纠结了两天,最后看控制台输出日志发现此问题。
  • 大小: 20.9 KB
分享到:
评论

相关推荐

    unitils整合dbunit利用excel进行单元测试

    unitils整合dbunit利用excel进行单元测试 包含mock以及整合spring进行测试

    Unitils单元测试

    Unitils的模块化设计是其另一大特点,包括unitils-core(核心模块)、unitils-database(数据库管理)、unitils-DbUnit(DbUnit集成)、unitils-easymock(EasyMock支持)、unitils-inject(对象注入)、unitils-...

    Unitils示例

    在本示例工程中,我们将会探讨 Unitils 如何与 DBUnit 和 EasyMock 集成,以实现高效的单元测试。 1. **Unitils 框架** Unitils 是一个开源的测试框架,旨在通过自动化常见的测试任务来提高测试效率。它支持 JUnit...

    使用Unitils测试DAO

    分析DBUnitUtils类的源码可以帮助我们理解作者是如何结合Unitils与DBUnit进行DAO测试的。这可能包括对特定数据库操作的模拟,如事务管理、异常处理以及数据验证逻辑。 6. **工具的使用和集成**: Unitils可以与...

    spring与dbunit集成测试

    本文将深入探讨如何将Spring与DBUnit整合,以实现高效、可靠的数据库集成测试。 首先,理解Spring的核心功能是至关重要的。Spring是一个开源的Java平台,它为构建应用程序提供了全面的支持,包括依赖注入...

    主题:在Spring中结合Dbunit对Dao进行集成单元测试

    通常使用的是dbunit核心库和spring-test-dbunit库,后者提供了与Spring集成的便利。 Maven示例: ```xml <groupId>org.dbunit <artifactId>dbunit <version>3.6.2 <scope>test <groupId>...

    DBUNIT使用

    DbUnit 还可以与 JUnit 集成,使用 DbUnit 的 TestCase 子类来编写测试用例。DbUnit 的使用可以使数据库测试变得更方便快捷。 DbUnit 还提供了多种方式来访问数据库,例如使用 IDatabaseConnection 接口来访问实际...

    Unitils-jar包

    Unitils 构建在DbUnit 与 EasyMock 项目之上并与JUnit 和TestNG 相结合。支持数据库测试,支持利用Mock 对象 进行测试并提供与Spring 和Hibernate 相集成。Unitils 设计成以一种高度可配置和松散耦 合的方式来添加...

    unitils-3.3-with-dependencies.zip

    - `unitils-dbunit.jar`:扩展库,提供了与DBUnit集成的功能。 - `unitils-inject.jar`:依赖注入模块。 - `unitils-jdbc.jar`:数据库测试支持模块。 - `unitils-mock.jar`:模拟对象模块。 - `unitils-orm.jar`:...

    dbunit2.2

    4. **连接数据库**:DBUnit 可以与各种关系型数据库(如MySQL、Oracle、SQL Server等)配合使用,只需要提供JDBC驱动和相应的连接参数。 5. **异常处理**:DBUnit 自带了对数据库异常的处理机制,如果在执行过程中...

    dbunit-2.4.9 源码

    - 集成测试:验证多个模块或服务之间的交互,确保数据库交互没有问题。 - 回归测试:每次代码更新后,通过 DBUnit 自动运行测试,防止引入新的数据库相关错误。 总之,DBUnit 是一个强大的工具,能够简化数据库测试...

    DBUnit最佳实践之数据备份与恢复

    在“DBUnit最佳实践”中,作者可能还会讨论如何结合使用DBUnit与其他工具,如Ant或Maven构建工具,以及持续集成服务器如Jenkins,来自动化数据备份和恢复的过程。这样可以节省手动操作的时间,并减少人为错误的可能...

    Dbunit数据库连接下载

    在描述中提到的"flash能过控制java来运用数据库",这可能是指通过Java的Flex或Adobe AIR接口,使Flash应用程序能够与Java后端进行交互,进而利用Dbunit对数据库进行操作。这样的组合可以让前端的富媒体应用具有强大...

    dbunit帮助文档(HTML版)

    2. **数据比较**:DBUnit提供了断言机制,可以比较数据库的实际状态与预期状态,确保测试的准确性。 3. **数据清理**:在每个测试之前,DBUnit可以清空表,确保测试环境的一致性。 4. **数据填充**:通过XML或CSV...

    如何使用DBUnit做数据备份恢复

    在本文中,我们将深入探讨如何利用 DBUnit 进行数据库的备份与恢复。 首先,我们需要了解 DBUnit 的基本概念。DBUnit 主要使用两种数据格式:XML 和 FlatFile。XML 数据格式允许更复杂的数据结构,而 FlatFile 格式...

    dbunit-2.4.7所有jar以及dbunit入门教程

    1. 安装与依赖:介绍如何添加 DBUnit 和相关依赖到项目中。 2. 创建数据集:讲解如何编写 XML 数据集或 CSV 数据集。 3. 数据库连接:解释如何通过 JDBC 建立数据库连接并创建 `IDatabaseConnection` 实例。 4. 数据...

    Unitils框架与模块扩展

    Unitils构建在DBUnit与EasyMock项目之上并与JUnit和TestNG相结合,支持数据库测试,支持利用mock对象进行测试并提供与Spring和Hibernate相集成。Unitils设计成以一种高度可配置和松散偶合的框架来添加这些服务到单元...

    dbunit开发文档

    1. JUnit 集成:DBUnit 可以很容易地与 JUnit 结合使用,通过 `@Before` 和 `@After` 注解来设置和清理数据库。 2. Spring 集成:如果你的项目使用 Spring,可以利用 Spring's `DbUnitTestExecutionListener` 来...

    dbunit测试demo

    它支持多种数据库,包括 Oracle、MySQL、SQL Server 等,并且与 JUnit 集成紧密,允许在测试用例执行前后操作数据库。 2. **数据集(Dataset)**:在 DBUnit 中,数据集定义了测试用例所需的数据库状态。它们通常以...

    dbunit使用必需Jar包

    DBUnit 是一个开源的 Java 工具,它与JUnit结合使用,用于数据库的测试驱动开发(TDD)。在Java应用程序的测试过程中,确保数据库状态的一致性是非常重要的,DBUnit 提供了这样的功能,它允许开发者导入和导出数据库...

Global site tag (gtag.js) - Google Analytics