为什么选择Untils作为本次项目单元测试框架呢?
Unitils的优点和介绍网上都比较详细:http://www.unitils.org/summary.html;它的主要模块有:
· DatabaseModule: 测试数据库维护和连接池
· DbUnitModule: 使用DBunit进行测试数据维护
· HibernateModule: Hibernate配置支持和自动的数据库mapping检查
· MockModule: 支持使用Unitils的mock框架进行mock创建
· EasyMockModule: 支持使用EasyMock的mock框架进行mock创建
· InjectModule: 支持注入mock对象到其他对象中
· SpringModule: 支持载入Spring配置文件、检索或注入Spring Beans
本次项目并没有全部用到它的所有特性,其中我使用到的优秀特性和功能有:
l 为Spring集成的单元测试提供很好的解决方案
l 数据库相关测试的数据准备,事务回滚
l 简单方便的Assert工具
方法一. 继承UnitilsJUnit4
方法二. 在测试类上添加annotation:@RunWith(UnitilsJUnit4TestClassRunner.class)
方法三. 拷贝UnitilsJUnit3(UnitilsJUnit4)的代码生成一个MyUnitilsJunit3,然后测试类继承这个类。这种方法的好处是MyUnitilsJunit3可以随意继承一个Junit3 TestCase 的子类,比如: AbstractDependencyInjectionSpringContextTests,从而可以更加方便的加入自己需要的功能。
在基类中设置公用的Spring 配置
@SpringApplicationContext( {"/bean/profile/base-beans.xml"})
public class DAOTestBase extends UnitilsJUnit4{
}
子类中特殊化的Spring配置
public class UserDAOTest extends DAOTestBase{
@SpringApplicationContext( {"/bean/profile/base-beans.xml","/bean/profile/extra-beans.xml"})
protected ApplicationContext applicationContext;
@SpringBean("userDAO")
private UserDAO userDAO;
@SpringBeanByName
private UserDAO userDAO;
@SpringBeanByType
private UserDAO userDAO;
}
(1). 在unitils.properties当中进行配置
database.driverClassName=com.mysql.jdbc.Driver database.url=jdbc:mysql://192.168.205.62:3310/pro_general?characterEncoding=UTF-8
database.userName=profile
database.password=profile
database.schemaNames=pro_general
database.dialect=mysql
设置数据载入策略为先删除再插入。常用的载入策略有CleanInsertLoadStrategy; InsertLoadStrategy;RefreshLoadStrategy;UpdateLoadStrategy;顾名思义,这些策 略不 难理解。
DbUnitModule.DataSet.loadStrategy.default=org.unitils.dbunit.data setloadstrategy.impl.DeleteInsertLoadStrategy
数据集的格式支持多种,常用的有xml和excel,本项目中使用excel的xls文件(不是xlsx)。 毕竟excel的编辑更加方便。下面的配置指定默认数据集解析方式
DbUnitModule.DataSet.factory.default=org.unitils.dbunit.datasetfa ctory.impl.XlsDataSetFactory
(2). 在测试类中指定数据加载
@DataSet
public class TagTest extends DAOTestBase {
@ExpectedDataSet
public void testUpdate(){
}
}
Annotation @DataSet指明该类下的所有测试方法执行前都需要进行数据准备。DataSet中可以指明数据文件的具体路径和文件名,如果没有指定,默认在执行测试方法前先找${ClassName.methodName}的数据文件,再找${ClassName}的数据文件(文件格式为前面设置过的数据集格式)。
@ExpectedDataSet用于检查执行结果是否和预期一致。预期数据集文件和前面的数据准备文件查找过程类似只是文件名后面多了个“-result”。
@Transactional(TransactionMode.ROLLBACK)
在测试类或方法上添加Transactional Anotation,用于指定事务执行方式。这里提一下Unitils的一个bug,使用Transactional Anotation时测试类必须继承UnitilsJUnit4,用@RunWith的方式则不行。