篇首语
本文假设读者已经熟悉单元测试及JUnit工具的使用,如果对单元测试及JUnit尚不了解请先学习单元测试及JUnit工具的相关知识。读者最好对Spring框架及Spring框架提供的单元测试支持有所了解,因为本文案例基于Spring技术编写。但对Spring不了解并不影响本文所讲述的单元测试用例编写及回调模式、模板方法的应用。
单元测试是编写高质量代码的前提,通过编写有效的单元测试即可以保证代码的质量又可以提高开发速度,因为大多数问题都可以通过单元测试发现并解决而不需要部署到应用服务器。纵览网上流行的优秀开源框架,无一不提供完整的单元测试用例。Spring框架便是其中的代表和佼佼者,因为Spring所遵循的控制反转(IoC)和依赖注入(DI)原则使编写有效、干净的单元测试用例变得更加方便、快捷。
编写单元测试用例
本文所采用的案例非常简单,就是对数据库表的增、删、改、查操作进行测试。假设我们有这样一个表url(MySql数据库):
正如你所见,该表只有几个字段,但对于我们的案例来说完全够用。
看到此处,你应该清楚我们是要对数据库操作进行单元测试。如果你是一位经验丰富的开发人员,此时已经会有许多疑问,甚至已经失去继续阅读本文的兴趣:
² 单元测试不应该直接操作数据库?
² 对数据库操作的单元测试可以采用DAO模式,Mock一个实现类?
² 使用内存数据库?
² 其他?
数据库表有了,我们接下来编写DAO及其实现类:
DAO接口:
/**
* @author tao.youzt
*/
public interface BizUrlDAO {
public Object insert(BizUrlDO bizUrlDO);
public int delete(String url);
public BizUrlDO getByUrl(String url);
}
DAO实现类,该类继承一个支持类,封装了对数据库的操作。
/**
* @author tao.youzt
*/
public class BizUrlIbatisImpl extends GodzillaDaoSupport implements BizUrlDAO {
private static final String GET_BY_URL = "SELECT-BIZ-URL";
private static final String DELETE = "DELETE-BIZ-URL";
private static final String INSERT = "INSERT-BIZ-URL";
public int delete(String url) {
return this.delete(DELETE, url);
}
public BizUrlDO getByUrl(String url) {
return this.queryForObject(GET_BY_URL, url, BizUrlDO.class);
}
public Object insert(BizUrlDO bizUrlDO) {
return this.insert(INSERT, bizUrlDO);
}
}
DO领域对象
/**
* @author tao.youzt
*/
public class BizUrlDO {
private int id;
private String url;
private String email;
private String name;
// getter and setter
}
因为本文案例使用Spring作为底层框架,因此这里需要编写Spring配置文件对DAO进行组装。
Godzilla-dao.xml