不管是测试驱动开发或者是其它的开发模式,都会需要对代码进行单元测试,对于关联依赖关系少或者比较简单的类来说,直接使用JUnit就可以轻松的完成测试工作,但是对于关联到其它比较复杂的类或对运行环境有要求的类的单元测试,比如ejb,servlet或Dao等,测试起来或者需要配置特定的环境,或者十分耗时,给单元测试造成困难。在这里介绍使用JMock来模拟那些不需要测试的类,帮助完成有单元测试。
例如,有这样两个类,一个是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-1.0.1.jar ,jmock-cglib-1.0.1.jar ,cglib-full-2.0.jar 三个jar包,然后在JUnit中执行BusinessTest.java,会显示绿棒,这样,在没有数据库的情况下,单元测试成功。
使用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,还会找到很多有用的东西。
分享到:
相关推荐
因此,在使用JMock进行单元测试时,需要特别注意这个版本间的差异。这个变化意味着需要根据最新版本的文档来编写测试代码。 5. Mock对象的作用 Mock对象在单元测试中的作用是模拟被测试对象的依赖项。当依赖项复杂...
**JMock使用文档** 在Java开发中,单元测试是一...通过学习这些文档,开发者可以更全面地了解如何有效地使用JMock进行单元测试,提升测试覆盖率和代码质量。如果你在学习过程中遇到任何问题,可以随时咨询445054051。
不管是测试驱动开发或者是其它的开发模式,都会需要对代码进行单元测试,对于关联依赖关系少或者比较简单的类来说,直接使用JUnit就可以轻松的完成测试工作,但是对于关联到其它比较复杂的类或对运行环境有要求的类...
它可能包含了一些自动化测试工具或者测试管理功能,帮助开发者更高效地进行单元测试。 **总结** 这个资料集合对于深入理解并实践Java单元测试是极其宝贵的资源。通过`jtest`,你可以进行全方位的测试活动;借助`...
要使用`jmock`进行单元测试,你需要: 1. 引入`jmock`库。 2. 创建模拟对象,定义期望的行为。 3. 在测试方法中,执行待测试的代码。 4. 使用`jmock`的验证机制检查期望是否满足。 ### 7. 文档资源 `doc`目录通常...
在实际应用中,jMock常与其他测试框架如JUnit、TestNG等配合使用,通过它们的注解功能将模拟对象和测试用例紧密结合起来。同时,jMock也可以与EasyMock等其他模拟框架协同工作,提供更丰富的测试策略。 总结来说,...
**Jmock2.6 Jar包**是Java编程领域中用于单元测试的重要库,它提供了模拟对象的功能,使得开发者能够在测试代码时对复杂依赖关系进行控制和隔离。在本文中,我们将深入探讨Jmock2.6的核心特性、使用场景以及如何在...
《jMock 2.5.1:模拟对象与单元测试的艺术》 jMock是一个强大的Java模拟框架,它在软件开发的单元测试阶段扮演着至关重要的角色。jMock 2.5.1是该框架的一个版本,它提供了丰富的功能,帮助开发者创建虚拟对象,...
本文将深入探讨JMock库,它是一个强大的Java模拟框架,常用于单元测试,以及如何结合Spring测试模块进行高效测试。 JMock是一个用于创建和验证对象行为的模拟框架,它允许开发者在测试中模拟对象的行为,而不是依赖...
JMock 是一个Java平台上的单元测试框架,专门用于模拟对象,以便在测试过程中控制和验证对象的行为。它基于EasyMock库,但提供了更强大的功能,尤其是对于处理复杂交互和顺序的场景。JMock使得开发者可以在不依赖...
《JMock Cookbook资源整合》是关于Java测试领域中JMock库使用的详细指南,旨在帮助开发者更好地理解和运用这个强大的模拟框架。JMock是一个用于Java应用程序单元测试的工具,它允许程序员模拟对象的行为,以便在孤立...
JMock 是一个流行的开源测试框架,专为Java开发者设计,用于模拟对象的行为,特别是在单元测试中。它允许程序员在不依赖真实对象的情况下测试代码,提高了测试的效率和隔离性。这篇详尽的讨论将深入JMock的核心概念...
总之,JMock是Java开发者进行单元测试的重要工具,它通过模拟对象的创建和行为控制,帮助我们编写出更健壮、更可靠的代码。结合jmock-core和jmock-cglib这两个库,我们可以应对各种复杂的测试场景,提升测试的质量和...
而JMock和EasyMock则是两种广泛使用的Java单元测试框架,它们允许开发者模拟对象的行为和交互,以便于测试复杂的系统。本资源包含JMock 2.5.1和EasyMock 3.0的库文件,使得开发者在进行单元测试时无需再四处寻找相关...
这个压缩包“jmock-1.2.0-jars.rar”包含的是 JMock 1.2.0 版本的 jar 文件,它为开发者提供了强大的模拟框架,以帮助他们进行更加灵活和可靠的测试。 1. **JMock 概述** JMock 是基于 Mock Object 设计模式的工具...
《JMOCK-2.6.0:强化Java单元测试的艺术》 在软件开发的世界里,测试是确保代码质量不可或缺的一环。而JMOCK,作为一款强大的Java模拟框架,正是为了解决这一问题应运而生。"JMOCK-2.6.0"是一个专门用于项目测试的...
#### 四、使用 jMock 编写单元测试示例 以下是一个使用 jMock 的简单示例,展示了如何为 `UserService` 类编写单元测试: ##### 1. 实体类:`User` ```java package com.sarkuya.model; public class User { ...