Unitils这个Java开源类包的目的是让单元测试变得更加容易和可维护。Unitils构建在DBUnit与EasyMock项目之上并与 JUnit和TestNG相结合。支持数据库测试,支持利用mock对象进行测试并提供与Spring和Hibernate相集成。Unitils设计成 以一种高度可配置和松散偶合的方式来添加这些服务到单元测试中。
对于想学习使用此测试框架的同学可参看以下的一些资料:
单元测试:Unitils的简单使用 http://www.open-open.com/lib/view/open1351682818848.html
Unitils 学习笔记 http://macrochen.iteye.com/blog/531445
单元测试系列之3:测试整合之王Unitils http://stamen.iteye.com/blog/1480316
单元测试系列之4:使用Unitils测试DAO层 http://stamen.iteye.com/blog/1484589
单元测试系列之5:使用unitils测试Service层 http://stamen.iteye.com/blog/1485837
这些资料都对Unitils的原理和使用方式都进行了详细的介绍,但对于象我这样第一次接触Unitils,DBUnit,EasyMock这些东西的人显得有些复杂了。希望通过一个可运行的示例程序将这些内容串起来,好有一个直观的了解。
在网上搜索了一下,找到一个老外写的Unitils示例应用。模拟了一个人力资源应用程序,为某一职位的雇员设置基准工资。系统分为业务层和数据访问层,使用Ebean做ORM操作HsqlDB数据库。原文地址:http://www.devx.com/Java/Article/35129
将工程下来后发现运行不了,原来此工程是2007年写的使用的包的方法比较旧。只好自己动手改造一下。
DAO层
public List<Employee> findEmployeesByTitle(String title) throws DataAccessException { if (title == null) throw new IllegalArgumentException("Job title cannot be null."); List<Employee> result; try { result = Ebean.find(Employee.class).where().eq("title", title).findList(); } catch (Throwable e) { throw new DataAccessException(e); } return result; }
unitils.modules=database,dbunit,easymock,inject unitils.module.hibernate.enabled=false unitils.module.spring.enabled=false # these placeholders are set in avaje.properties database.driverClassName=org.hsqldb.jdbcDriver database.url=jdbc:hsqldb:mem:unitils-example database.userName=sa database.password= database.schemaNames=PUBLIC database.dialect=hsqldb updateDataBaseSchema.enabled=true # unitils will construct the test database using the ddl file found in this # directory dbMaintainer.autoCreateExecutedScriptsTable=true //自动创建脚本,否则报错 dbMaintainer.script.locations=src/main/resources //ddl文件路径与原来不同 dataSetStructureGenerator.xsd.dirName=src/test/resources/dataset-schema sequenceUpdater.sequencevalue.lowestacceptable=100
在此过程中遇到了一些问题:
org.dbunit.dataset.NoSuchTableException 解决方法是SCHEMA的名字必须是大写。 http://linkyou.blog.51cto.com/1332494/283201
org.dbunit.dataset.NoSuchColumnException 解决方法是使用Unitils 3.3默认依赖的dbunit 2.2.2版本或者修改dbunit的DefaultMetadataHandler.java文件。http://zfanxu.iteye.com/blog/1508339