- 浏览: 77851 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (87)
- Lucene (8)
- struts (0)
- spring (0)
- Ajax (1)
- asp (1)
- c/c++ (0)
- java (16)
- javascript (2)
- vb (3)
- 数据库 (6)
- 生活 (0)
- 计算机其它 (4)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (0)
- [网站分类]2.Java新手区 (1)
- [网站分类]3.非技术区 (0)
- [网站分类]4.其他技术区 (0)
- [网站分类]5.提问区(Java方面的技术提问) (0)
- [网站分类]6.转载区(Java技术文章转载, 请注明原文出处) (2)
- [网站分类]8.求职招聘区 (0)
- [发布为文章] (0)
- [发布为日记] (0)
- [发布为新闻] (0)
- ibatis (0)
最新评论
-
vern:
受益了,谢谢
not in 失效 -
todayapple:
你的折线图能出来吗。。。
jfreechart例子 -
reachingstar:
Good, 但还是没能弄太明白!
JBoss启动过程 -
liheqian_0083:
HOHO,收监
lucene中文分词
xp开发的一个利器--EasyMock。
EasyMock是一种 动态生成模仿对象以便应用于单元测试的工具,有了它可摆脱容器进行单元测试了。
它的使用很简单,下面一个简单登陆验证的例子:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter( " username " );
String password = request.getParameter( " password " );
// check username & password:
if ( " admin " .equals(username) && " 123456 " .equals(password)) {
ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getNamedDispatcher( " dispatcher " );
dispatcher.forward(request, response);
}
else {
throw new RuntimeException( " Login failed. " );
}
}
}
这个 Servlet 实现简单的用户验证的功能,若用户名和口令匹配“ admin ”和“ 123456 ”,则请求被转发到指定的 dispatcher 上,否则,直接抛出 RuntimeException 。
为了测试 doPost() 方法,我们需要模拟 HttpServletRequest , ServletContext 和 RequestDispatcher 对象,以便脱离 J2EE 容器来测试这个 Servlet 。
我们建立
TestCase
,名为
LoginServletTest
:
}
我们首先测试当用户名和口令验证失败的情形,演示如何使用EasyMock来模拟HttpServletRequest对象:
public void testLoginFailed() throws Exception {
MockControl mc = MockControl.createControl(HttpServletRequest. class );
HttpServletRequest request = (HttpServletRequest)mc.getMock();
// set Mock Object behavior:
request.getParameter( " username " );
mc.setReturnValue( " admin " , 1 );
request.getParameter( " password " );
mc.setReturnValue( " 1234 " , 1 );
// ok, all behaviors are set!
mc.replay();
// now start test:
LoginServlet servlet = new LoginServlet();
try {
servlet.doPost(request, null );
fail( " Not caught exception! " );
}
catch (RuntimeException re) {
assertEquals( " Login failed. " , re.getMessage());
}
// verify:
mc.verify();
}
然后,即可获得 MockControl 创建的 Mock 对象:
下一步,我们需要“录制” Mock 对象的预期行为。在 LoginServlet 中,先后调用了 request.getParameter("username") 和 request.getParameter("password") 两个方法,因此,需要在 MockControl 中设置这两次调用后的指定返回值。我们期望返回的值为“ admin ”和“ 1234 ”:
request.getParameter( " password " ); // 期望下面的测试将调用此方法,参数为" password"
mc.setReturnValue( " 1234 " , 1 ); // 期望返回值为"1234",仅调用1次
try {
servlet.doPost(request, null );
fail( " Not caught exception! " );
}
catch (RuntimeException re) {
assertEquals( " Login failed. " , re.getMessage());
}
由于本次测试的目的是检查当用户名和口令验证失败后, LoginServlet 是否会抛出 RuntimeException ,因此, response 对象对测试没有影响,我们不需要模拟它,仅仅传入 null 即可。
最后,调用 mc.verify() 检查 Mock 对象是否按照预期的方法调用正常运行了。
运行
JUnit
,测试通过!表示我们的
Mock
对象正确工作了!
下一步,我们来测试当用户名和口令匹配时,LoginServlet应当把请求转发给指定的RequestDispatcher。在这个测试用例中,我们除了需要HttpServletRequest Mock对象外,还需要模拟ServletContext和RequestDispatcher对象:
HttpServletRequest requestObj = (HttpServletRequest)requestCtrl.getMock();
MockControl contextCtrl = MockControl.createControl(ServletContext. class );
final ServletContext contextObj = (ServletContext)contextCtrl.getMock();
MockControl dispatcherCtrl = MockControl.createControl(RequestDispatcher. class );
RequestDispatcher dispatcherObj = (RequestDispatcher)dispatcherCtrl.getMock();
按照doPost()的语句顺序,我们设定Mock对象指定的行为:
requestObj.getParameter( " username " );
requestCtrl.setReturnValue( " admin " , 1 );
requestObj.getParameter( " password " );
requestCtrl.setReturnValue( " 123456 " , 1 );
contextObj.getNamedDispatcher( " dispatcher " );
contextCtrl.setReturnValue(dispatcherObj, 1 );
dispatcherObj.forward(requestObj, null );
dispatcherCtrl.setVoidCallable( 1 );
requestCtrl.replay();
contextCtrl.replay();
dispatcherCtrl.replay();
public ServletContext getServletContext() {
return contextObj;
}
};
servlet.doPost(requestObj, null );
最后,检查所有Mock对象的状态:
requestCtrl.verify();
contextCtrl.verify();
dispatcherCtrl.verify();
运行 JUnit ,测试通过!
倘若 LoginServlet 的代码有误,例如,将 context.getNamedDispatcher("dispatcher") 误写为 context.getNamedDispatcher("dispatcher2") ,则测试失败, JUnit 报告:
junit.framework.AssertionFailedError:
Unexpected method call getNamedDispatcher("dispatcher2"):
getNamedDispatcher("dispatcher2"): expected: 0, actual: 1
getNamedDispatcher("dispatcher"): expected: 1, actual: 0
at ...
总结:
虽然
EasyMock
可以用来模仿依赖对象,但是,它只能动态模仿接口,无法模仿具体类。这一限制正好要求我们遵循“针对接口编程”的原则:如果不针对接口,则测试难于进行。应当把单元测试看作是运行时代码的最好运用,如果代码在单元测试中难于应用,则它在真实环境中也将难于应用。总之,创建尽可能容易测试的代码就是创建高质量的代码。
现在,easymock可以模仿类了,以下是在springside摘的:
bookManagerMockControl = MockClassControl.createControl(BookManager. class );
bookManagerMock = (BookManager) bookManagerMockControl.getMock();
controller.setBookManager(bookManagerMock);
// 录制getAllBook()和getCategorys方法的期望值
bookManagerMock.getAllBook();
bookManagerMockControl.setReturnValue( new ArrayList());
bookManagerMockControl.replay();
// 执行操作
mv = controller.handleRequest(request, response);
// 验证结果
assertModelAttributeAvailable(mv, " books " );
发表评论
-
我的项目的结构和配置文件
2006-06-27 17:33 676学习java有段时间了,最近自己根据网上的资料 ... -
JAVA-学习-网络资源
2006-07-05 00:00 703SUN中国技术社区 ... -
Swing的Jtable类(转载)
2006-07-05 13:25 23741 t ... -
使用FileUpload组件实现文件上传(转载)
2006-07-06 00:15 804文件上传在web应用中非常普遍 ... -
java读取中文文件
2006-07-06 00:20 1163java中读取中文文件经常出现乱码,是因为ja ... -
通过文本文档实现信息的批量导入(转)
2006-07-18 11:01 515... -
tomcat5.0中文问题
2006-08-10 15:26 5861 tomcat的j2ee实现 ... -
JDBC(转)
2006-08-24 13:36 911... -
page
2006-09-18 23:35 689<% ... -
jboss4.0的虚拟主机(摘)
2007-02-26 17:09 739什么也不需要改,只需 ... -
面试题集及解答(转)
2007-02-27 09:53 581出处:www.csdn.net[ 2004-09- ... -
apache tomcat 整合(转)
2007-02-28 09:44 1246Apache的HTTPD是目前 ... -
apache tomcat 整合
2007-03-01 10:04 898这一篇是我自己根据网上的资料又重新整的。准 ... -
jboss 的一些配置(端口,虚拟目录,虚拟主机,中文问题,数据库连接)(转)
2007-03-02 18:17 6661。访问端口配置 ... -
JBOSS 4.0 配置虚拟目录(转)
2007-03-05 10:40 1204我的环境: WINXP SP2 + JDK1.5 ...
相关推荐
easymock 的使用方法简介easymock 的使用方法简介
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。 ...
使用EasyMock做java单元测试的例子,包含所需要的jar包
easymock2 EasyMock使用简明手册
EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩;...EasyMock使用技巧; EasyMock使用简明手册; EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;
easyMock
IBM网站对EasyMock和使用场景的一些介绍
还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较...
easyMock2.2
EasyMock使用教程,快来看看你还有什么秘密没有发现吧!
EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。
NULL 博文链接:https://bruceliu02.iteye.com/blog/1775446
EasyMock 使用方EEasyMock 使用方法与原理剖析.rar
easymock测试servlet使用代码
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 easymock.jar,easymockclassextension.jar
NULL 博文链接:https://zhangzhenting.iteye.com/blog/1829416
EasyMock 的文档还有简单实例 还有需要的jar包
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂...