24分钟学会用JMock进行单元测试
2007-12-23 12:31:06 来源:WEB开发网例如,有这样两个类,一个是Dao.java,用于数据库访问成操作的,一个是Business.java,需要调用Dao进行业务处理。Dao.java是已经在有数据库的环境测试通过的,现在需要测试Business.java。通常情况下,我们需要在测试环境配置好数据库连接环境,并且需要准备数据后,才可以开始Business.java的测试,现在如果通过JMock就可以不配置数据库环境,也可以完成测试。
JMock网站链接:http://www.jmock.org
//Dao.java
package com.raistlin.test.jmock
public class Dao
{
public Dao()
{
}
public List execute(String sql)
{
//数据库操作...
}
}
//Business.java
package com.raistlin.test.jmock
public class Business
{
PRivate Dao dao ;
public void setDao(Dao dao)
{
this.dao = dao;
}
public String Operate()
{
List list = dao.execute("select * from tbl_test");
return (String) list.get(0);
}
}
//BusinessTest.java
package com.raistlin.test.jmock
import org.jmock.cglib.MockObjectTestCase;
import org.jmock.cglib.Mock;
public class BusinessTest extends MockObjectTestCase
{
private Mock mockDao = null;
private Business business = null;
protected void setUp() throws Exception
{
super.setUp();
mockDao = new Mock(Dao.class);
business = new Business();
}
protected void tearDown() throws Exception
{
mockDao = null;
business = null;
super.tearDown();
}
public void testOperate()
{
ArrayList stubList = new ArrayList();
stubList.add("test");
// 定义Mock剧本
mockDao.eXPects(once())// 期待次数
.method("execute")// 调用方法
.with(eq("select * from tbl_test"))// 传入参数等于
.will(this.returnValue(stubList));// 返回对象
Dao dao = (Dao) mockDao.proxy();
business.setDao(dao);
assertEquals(business.operate(), "test");
}
}
在工程中导入jmock-
使用JMock模拟类的条件:
1、要有无参数的构造器;
2、构造器是public;
这样对于private的构造器或单例模式的类应该是无法模拟了。这样就要求我们养成针对接口编程的习惯,对接口用JMock进行模拟将不受这些限制。只需要将
import org.jmock.cglib.MockObjectTestCase;
import org.jmock.cglib.Mock;
改为
import org.jmock.MockObjectTestCase;
import org.jmock.Mock;
即可。
对于Mock类,有很多API可供使用,比如:
isA(Class clz) 表示为某个类
isVoid() 将will()换成isVoid()表示无返回值
详细API可以参考一下DOC,还会找到很多有用的东西。
(出处:http://www.cncms.com)
赞助商链接