按照Kent
Back的观点,单元测试最重要的特性之一应该是可重复性。不可重复的单元测试不是说没有价值,但价值仅限于程序员自测代码功能,而不能用于持续集成。因此好的单元测试应该具备独立性和可重复性,对于业务逻辑层,可以通过mock底层对象,上层对象来获得这种独立性和可重复性。而DAO层因为是和数据库打交道进行CRUD操作的层,DAO层的单元测试的依赖于数据库中的数据,要实现DAO层的单元测试的可重复性就需要对于每次单元测试执行时数据库的数据都是符合要求的,但同时又不应该破坏其他数据。要保证这一点,就需要启动每轮单元测试时都能提供同样的数据,而在推出单元测试时,凡事破坏了原来数据库状态的(增,删,改)要在推出单元测试时将数据库恢复到原来的状态。
数据层的单元测试框架DbUnit等就是做这个事情的,更随着Unitils的出现,将SpringModule,DatabaseModule,DbUnitModule等整合在一起,使得DAO层的单元测试变得非常容易。
下面就以一个DAO的实现类为例介绍基于DbUnit使用Unitils作为测试框架,mysql作为测试数据库的详细过程,并对其过程中出现的各种问题给出解决方案。
具体环境:
DbUnit,2.4.8
Unitils: 2.4
Pom.xml中的dependency如下:
org.unitils
unitils
2.4
test
org.easymock
easymock
3.0
test
org.dbunit
dbunit
2.4.8
test
数据中已经建立User表,
CREATE TABLE USER
(
ID INT(11) NOT NULL
AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(50) NOT
NULL DEFAULT '',
GENDER VARCHAR(50) NOT
NULL DEFAULT ''
)
对应Annotation实体类为:
UserDAOImpl如下:
@Repository("userDAO")
public class
UserDAOImpl implements UserDAO {
@Autowired
private
SessionFactory sessionFactory;
@Transactional
public
List getAl