每次用开源的框架时,最蛋疼的不是业务逻辑如何如何复杂,而是痛苦的版本问题。开源的框架都不是不同的团队搞出来的东西,因此版本兼容做的不是很全面完善。可是作为一个小程序员也没有必要去指责框架的问题了,毕竟我们自己造轮子还是太费时,还有最重要的是水平达不到啊。在此就先发发牢骚了,下面切入正题了,相信用过unitils的朋友们都遇到过这个问题喽,截图如下:(此为dbunit2.4.9和poi3.9最新版本)
java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateFormatted(Lorg/apache/poi/hssf/usermodel/HSSFCell;)Z at org.dbunit.dataset.excel.XlsTable.getValue(XlsTable.java:153) at unitils.test.excel.MultiSchemaXlsDataSetReader$XlsTable.getValue(MultiSchemaXlsDataSetReader.java:114) at org.dbunit.operation.AbstractBatchOperation.isEmpty(AbstractBatchOperation.java:77) at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:135) at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79) at org.unitils.dbunit.datasetloadstrategy.impl.CleanInsertLoadStrategy.doExecute(CleanInsertLoadStrategy.java:45) at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:44) at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:230) at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:153) at org.unitils.dbunit.DbUnitModule$DbUnitListener.beforeTestSetUp(DbUnitModule.java:557) at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:273) at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:151) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95) at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:61) at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:44) at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:62) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:68) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
这里总是提示NoSuchMethod这个问题,翻看dbunit的pom.xml文件发现他依赖的是poi3.2-FINAL版本,这个真是让人吐血啊,这个版本比较久了,虽然在spring中导出Excel视图我用的是poi3.9版本,这两个版本Cell的创建方式不同,但我还是为了解决它换了poi3.2-FINAL版本,期望问题得以解决。在满怀信心的点击了
Junit Test后我的心凉了,发现又会提示如下错误:
org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method public void unitils.test.impl.UserDaoTest.findUserByUserName() at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:156) at org.unitils.dbunit.DbUnitModule$DbUnitListener.beforeTestSetUp(DbUnitModule.java:557) at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:273) at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:151) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95) at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:61) at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:44) at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:62) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:68) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 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:230) at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:153) ... 18 more Caused by: org.dbunit.dataset.NoSuchColumnException: user.ID - (Non-uppercase input column: 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:140) at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79) at org.unitils.dbunit.datasetloadstrategy.impl.CleanInsertLoadStrategy.doExecute(CleanInsertLoadStrategy.java:45) at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:44) ... 20 more
细看Caused by:是没有这列user.ID,google,度娘后发现只能是改源码或者把dbunit换成2.4.2版本。确实dbunit2.4.2和poi3.2-FINAL可以完美兼容,问题得以解决。可是我不甘心啊,为什么辛辛苦苦写的spring Excel View却要因为一个测试要从新更改为poi3.2的API,这是个不小的工程。于是我选择了暴力的手段,更改源码,google上说其实dbunit可以支持高版本的poi,就是要改pom文件,然后重新编译。
在网上找到了dbunit2.4.9的源码包,更改poi的依赖改为如下:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> <exclusions> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> <optional>true</optional> </dependency>
这样源码再重新编译时用到的就是poi3.9的API了,dbunit就可以支持高版本的poi版本了。
第一个问题得已解决了,第二个问题找不到***.ID是由于unitils和dbunit的版本不兼容的问题,因为unitils支持的dbunit是2.2.2。而unitils默认调用的是dbunit的DefaultMetadataHandler.class,需要把这个类更改为如下:
boolean areEqual = areEqualIgnoreNull(table, tableName, caseSensitive) && areEqualIgnoreNull(column, columnName, caseSensitive); return areEqual;
这样第二个问题得以解决了,当然也得重新编译dbunit2.4.9喽,最后问题得以解决了。截图如下:
下面我就献上我重新编译好的dbunit2.4.9jar文件和它的源码包,想自己编译就编译下好了,想用的就下载jar文件了。在此在说一句,在如此浩瀚的开源框架中何时才是个头啊,什么时候能用上自己的框架啊,哈哈哈。。。
相关推荐
DbUnit2.4.9,包括dbunit-2.4.9.jar、dbunit-2.4.9-sources.jar、dbunit-2.4.9-javadoc.jar,是junit的扩展,主要用于代码对数据库操作的单元测试。
在版本 2.4.9 中,DBUnit 提供了一系列的功能,帮助开发者在进行单元测试时能够管理和操作数据库的数据状态。 DBUnit 的核心功能包括: 1. 数据初始化:在测试前,DBUnit 可以导入 CSV、XML 或 Excel 文件中的数据...
dbUnit is a JUnit extension targeted for database-driven projects that, among other things, puts your database into a known state between test runs. Last Updated: 2015-09-07
dbunit-2.2.3..jar dbunit-2.4.2.jar dbunit-2.5.3.jar dbunit-2.7.0.jar 发现每个版本对JDK是有要求的,比如2.7 只能用于JDK1.8版本,所以整理好几个jar包挑选适合自己的
DBUnit 2.4.7 版本包含了所有的必需 jar 包,为开发者提供了完整的功能集。 DBUnit 的核心概念包括数据集、操作模式和数据类型映射。数据集是 DBUnit 的基础,它通常是一个 XML 文件或者 CSV 文件,描述了测试用例...
pom.xml 文件是Maven项目对象模型的配置文件,如果你的项目使用Maven作为构建工具,可以通过这个文件来管理Dbunit的依赖,包括版本控制和其他依赖项的管理。 src 文件夹通常包含源代码,尽管在这个压缩包中没有详细...
DbUnit 的使用可以分为两个部分:设置 DbUnit 和使用 DbUnit 进行测试。要使用 DbUnit,首先需要从 http://dbunit.sourceforge.net 上下载 JAR 文件,将此 JAR 文件放在集成开发环境或构建脚本的类路径中,并且需要...
7. **异常处理**:在测试过程中,如果数据不匹配或者数据库操作失败,DBUnit 将抛出异常,如 `ComparisonFailure` 或 `DatabaseUnitException`,帮助定位问题。 8. **自定义类型处理器**:DBUnit 默认支持基本数据...
为了更好地学习和实践这些概念,文档"单元测试JUnit4和DbUnit.doc"可能包含了详细的步骤和示例代码,而"dbunitAndJunit4"和"junit4"这两个文件夹可能包含了相关的练习项目或者源码,通过阅读和运行这些代码,可以...
1.1版本和1.2版本的jtds.jar输出信息可能包含了错误日志或调试信息,这些信息有助于识别不同版本驱动之间的差异,以及可能导致问题的具体代码片段。 解决此类问题通常需要以下步骤: 1. 检查数据库对象的名称长度...
dbunit的jar包,版本2.2
获取的,包含了DBUnit的所有核心功能和用法的详细说明。虽然没有以常见的CHM(Compiled Help Manual)格式提供,但这个HTML压缩包依然能够为开发者提供全面的参考信息。 ### DBUnit简介 DBUnit是一个强大的工具,...
在“dbunit2.2”这个压缩包中,包含了DBUnit 2.2版本的所有必要文件,使得开发者能够有效地进行数据库的单元测试。 DBUnit 的主要功能在于帮助开发者在执行测试前后对数据库进行初始化和清理,确保每次测试都在一个...
在Java应用程序的测试过程中,确保数据库状态的一致性是非常重要的,DBUnit 提供了这样的功能,它允许开发者导入和导出数据库数据,以进行精确的测试。 在使用 DBUnit 时,有几个必需的 Jar 包是必不可少的,这些 ...
DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类...
DbUnit 是一个针对数据库驱动项目的JUnit...在实际项目中,结合使用DbUnit和其他单元测试框架(如JUnit或TestNG),可以形成强大的测试解决方案,确保整个应用程序的质量,特别是在金融等对数据精确度要求极高的领域。
对于开发团队而言,使用DBUnit 可以提高测试覆盖率,减少因数据库问题导致的bug,同时也能简化回归测试过程,使得持续集成和交付流程更加顺畅。通过阅读链接中的博文(https://virgoooos.iteye.com/blog/186859),...
今天,我们将讨论如何使用JUnit和DbUnit进行单元测试,并将其与SSH整合。 SSH单元测试 在SSH项目中,单元测试是一个非常重要的步骤,它可以确保代码的正确性和可靠性。使用JUnit,我们可以编写单元测试用例来测试...
在IT行业中,数据库管理是至关重要的,特别是在软件开发和测试环节。...在实际项目中,理解和掌握DBUnit的最佳实践,不仅可以提高测试效率,还能确保数据安全,避免因意外数据丢失或损坏而导致的问题。