《Spring 3.0就这么简单》.(陈雄华,林开雄)第8章,对如何用Unitils进行测试简单介绍,下面是我用Unitils进行单元测试过程中遇到的问题的总结。

1、设置好pom.xml依赖后,pom文件报错:Missing artifact javax.transaction:jta:jar:1.0.1B

原因是本地maven库中缺少jta-1_0_1B-classes这个jar,需要把这个jar安装到本地库中去。
下载包含此jar的zip包,地址:http://download.csdn.net/detail/spring123tt/6847843
cmd到zip包的目录,运行下面的字符串
mvn install:install-file -Dfile=./jta-1_0_1B-classes.zip -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.0.1B -Dpackaging=jar

2、用Excel文件作为验证数据的输入源,执行TestNG的时候报错:
java.lang.NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFWorkbook
Caused by: java.lang.ClassNotFoundException: org.apache.poi.hssf.usermodel.HSSFWorkbook

原因:java在操作Excel等Office文件时,需要引入poi支持,所以需要在pom.xml中加入包依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>

3、执行TestNG报错:
java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateFormatted(Lorg/apache/poi/hssf/usermodel/HSSFCell;)

原因:dbunit对poi支持不够好,详见http://stamen.iteye.com/blog/1478022

更新dbunit版本到最新的2.5.1解决

4、执行TestNG报错:
org.apache.commons.beanutils.ConversionException: No value specified for 'Date'

原因:beanutils用到了时间等非内置对象时,如果对象为NULL则,会出现此异常

我的这个测试用例的目的是将Excel中的多行数据插入到数据库里面去,很显然,要插入的数据里面Date类型出现了null值。

先在XlsDataSetBeanFactory.createbeans方法中把读取到的数据逐行打印出来,看看到底哪些数据在捣鬼。我的Excel数据是这样的:

而实际打印的数据却出现了:

stu_netname:null
stu_password:null
stu_realname:null
stu_registdate:null

虽然Excel文件中有几行用看上去都是空白,但是实际上很可能是添加了空格在里面,从而引起类似的错误,解决方法就是把Excel文件中真实数据下面的几行删掉。

另外,通过google搜索到了另外的解决方法,思路是遇到Null值得时候进行规避而不是报错:http://www.blogjava.net/javagrass/archive/2011/10/10/352856.html

5、执行TestNG报错:
org.dbunit.DatabaseUnitRuntimeException: At least one column is required to build a valid select statement

起因是新版本的dbunit细化了各种数据库的MetadataHandler的处理,为每一种数据库提供了一个MetadataHandler,如MySqlMetadataHandler,Db2MetadataHandler等。而unitils并没有升级,仍然使用dbunit提供的DefaultMetadataHandler。这个DefaultMetadataHandler并不能很好的处理各个数据库之间的不同,所以会导致兼容问题。

解决方案:写一个拓展类MySqlDbUnitModule继承 DbUnitModule,

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

使用新建的MySqlDbUnitModule替换默认的DbUnitModule。这个就比较简单了,在unitils.properties中加入:
unitils.module.dbunit.className=com.miraclesea.test.database.module.MySqlDbUnitModule

该问题参考:http://my.oschina.net/u/719192/blog/173644

6、我的bean声明采用,注解+自动扫描的方式:

<context:component-scan base-package="com.huawei.happycar.dao.impl,com.huawei.happycar.service.impl" />

我的业务里面定义为:

@Service("studentServiceBean")
public class StudentServiceImpl implements StudentService {}

对studentServieBean,TestNG执行的时候就会报错(意思是找不到这个bean):
Unable to assign the Spring bean value to field annotated with @SpringBean 
Unable to assign the value to field: studentServiceImpl. Ensure that this field is of the correct type. Value: com.huawei.happycar.service.impl.StudentServiceImp

如果我定义为:

@Service("studentServiceBean")
public class StudentServiceImpl  {}

对studentServieBean,TestNG执行的时候没有一点问题。

另外,如果我用Junit的方法测试,两种方法都没有问题,该问题我还没有解决,怀疑是Unitils的bug


使用Excel作为数据源进行Unitils测试时,要注意的问题

1、unitils配置文件的设置中如下两项要按照实际的路径进行修改

DbUnitModule.DataSet.factory.default=com.huawei.happycartest.dataset.excel.MultiSchemaXlsDataSetFactory
DbUnitModule.ExpectedDataSet.factory.default=com.huawei.happycartest.dataset.excel.MultiSchemaXlsDataSetFactory

2、测试方法

public class StudentDaoTest extends BaseDaoTest {
@SpringBean("StudentDaoImpl")
private StudentDaoImpl StudentDaoImpl;
@Test
@ExpectedDataSet("StudentDao.SaveStudents.xls")
public void saveUsers()throws Exception {
List<Student> users = XlsDataSetBeanFactory.createBeans(StudentDaoTest.class,"StudentDao.SaveStudents.xls", "t_student", Student.class);
for(Student u:users){
StudentDaoImpl.save(u);
}
}
}

上面的写法中StdentDao.SaveStudents.xml一定要和StudentDaoTest.class在一个目录下。


使用Junit方法的测试

    @Test
public void test() {
ApplicationContext ac = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml", "spring-hibernate.xml" });
// 从Spring的IOC容器中获取bean对象
StudentService userService = (StudentService) ac.getBean("studentServiceBean");
// 执行测试方法
List<Student> list = userService.listAllStudent();
for(Student stu : list)
{
System.out.println(stu.getStuNetname());
}
}

这个Unitils测试框架官网上维护更新非常慢,Unitils的官方最新版本是3.3,对应的发布时间是2011年12月22号。
所以显然它不能支持Hibernate4了,另外就是Spring4估计也不是完美。
支持决定放弃使用这个测试框架,学习一下spring test。

用Unitils测试BaseDao遇到的问题总结的更多相关文章

  1. 使用Unitils测试DAO层

    Spring 的测试框架为我们提供一个强大的测试环境,解决日常单元测试中遇到的大部分测试难题:如运行多个测试用例和测试方法时,Spring上下文只需创建一次:数据库现场不受破坏:方便手工指定Sprin ...

  2. 测试整合之王Unitils

    16.4.1  Unitils概述(1) Unitils测试框架目的是让单元测试变得更加容易和可维护.Unitils构建在DbUnit与EasyMock项目之上并与JUnit和TestNG相结合.支持 ...

  3. 单元测试工具 unitils

    Unitils模块组件 Unitils通过模块化的方式来组织各个功能模块,采用类似于Spring的模块划分方式,如unitils-core.unitils-database.unitils-mock等 ...

  4. 《Spring 3.x 企业应用开发实战》目录

    图书信息:陈雄华 林开雄 编著 ISBN 978-7-121-15213-9 概述: 第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识. 第2章:通过一个简单的例 ...

  5. 不依赖Hibernate的万能BaseDao---模仿了Hibernate底层的原理

    今天写了个万能的BaseDao:有了这个BaseDao以后的Dao层直接继承这个BaseDao就能直接操作数据库了,增删改查,这是一个简易的Hibernate模型.写这个BaseDao的原因是最近在学 ...

  6. Unitils集成DBUnit、Spring-单元测试

    Unitils集成DBUnit.Spring-单元测试 1.maven-pom文件中引入相关jar包 <!-- Unitils -dbunit.Spring --> <depende ...

  7. 关于unitils联合dbunit的测试

    unitils据说测试的能力很强大,可测试dao,service,web层,其实对数据库的测试我更关心,看到有人展示了测试的方法,数据直接写在xls表中,很直观,然后就依照他们的方法进行试验,花费的时 ...

  8. SSH框架搭建最终版【测试、log4j、baseDao】

    最详细搭建SSH框架环境 本博文主要是讲解如何搭建一个比较规范的SSH开发环境,以及对它测试[在前面的搭建中,只是整合了SSH框架,能够使用SSH实现功能],而这次是相对规范的. 导入开发包 在Str ...

  9. Unitils集成DBUnit、Spring-单元测试(转)

    1.maven-pom文件中引入相关jar包 <!-- Unitils -dbunit.Spring --> <dependency> <groupId>org.u ...

随机推荐

  1. Android:TabHost实现Tab切换

    TabHost是整个Tab的容器,包含TabWidget和FrameLayout两个部分,TabWidget是每个Tab的表情,FrameLayout是Tab内容. 实现方式有两种: 1.继承TabA ...

  2. LSM Tree解析

    引言 众所周知传统磁盘I/O是比较耗性能的,优化系统性能往往需要和磁盘I/O打交道,而磁盘I/O产生的时延主要由下面3个因素决定: 寻道时间(将磁盘臂移动到适当的柱面上所需要的时间,寻道时移动到相邻柱 ...

  3. 小白日记13:kali渗透测试之服务扫描(三)-SMTB扫描、防火墙识别、负载均衡识别、WAF识别

    SMTP扫描 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/ ...

  4. java io文件学习笔记

    File f = new file("D:"+File.separator+"test.txt"); File.separator跨系统文件分隔符 f.crea ...

  5. java通过反射获取调用变量以及方法

    一:反射概念 可以通过Class类获取某个类的成员变量以及方法,并且调用之. 二:通过反射获取方法.变量.构造方法 @Test // 通过反射获取类定义的方法 public void testMeth ...

  6. 怎么删除远程登录连接的ip

    通过远程桌面可以登录到远程电脑上进行相应的操作,在登录过后会在本地电脑上留下登录过的IP以及登录用户名相关信息,可能会给远程的电脑带来安全隐患,下面介绍一下清除远程桌面历史记录的方法. 1.删除我的文 ...

  7. 关于Linux的总结(三)

    1.man_page.txt 1.内部命令:echo 查看内部命令帮助:help echo 或者 man echo 2.外部命令:ls 查看外部命令帮助:ls --help 或者 man ls 或者 ...

  8. MSP430常见问题之复位系统类

    Q1:请问msp430 怎么手动复位啊?是不是连到RST/NMI 上?但是这个脚不是和JTAG 连吗?我看到一些资料上说复位的话还要上拉电阻或者复位电路.A1:JTAG 功能只在下载程序时候使用,正常 ...

  9. Git工作流

    关于git工作原理请参见:http://blog.csdn.net/zdy0_2004/article/details/46552227

  10. hdu 2412 树形DP

    思路:对于最大的人数很容易想到,就直接dp.但对于最大值是否唯一就需要应用辅助数组,isOnly[i][0]表示dp[i][0]是否唯一,同理isOnly[i][1]. 那么当(dp[v][0]> ...