动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.一个合格程序员该做的事情——你.
.Spring 2.0 M1发布了.
.Java 程序中的多线程(四).
..NET的“无触式”配置:一个新的.
.用Apache Velocity模板引擎速造网.
.struts2的struts.properties配置.
.WebLogic的初步研究.
.电话管理系统.java.
.Java不该转换至.Net的五大理由.
.关于JCreator Pro 3.0的一个折中.
.Java 中classspath 的默认值是什.
.java的本地化问题.
.用Spring、Hibernate和JBoss简易.
.Folder 对象.
.Java技术实现数据库应用系统慨述.
.Struts常见异常信息和解决方法.
.第一个JNI程序--HelloNative.
.JAVA中几个易混淆关键词的理解.
.接收网络服务器发送来的数据.
.Java环境中封装多MIDIet程序.

Mock 概述以及用 Mock Object 进行测试

发表日期:2008-1-5 |



  MockObject概述
  使用Mock Object进行测试,主要是用来模拟那些在应用中不轻易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)从而使测试顺利进行的工具。
  
  目前,在Java阵营中主要的Mock测试工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微软的.Net阵营中主要是Nmock,.NetMock等。
  
  以下就对在Java中使用的Mock Object进行测试的常用工具做一下使用说明。
  
  JMock
  简介
  预备
  1.获取J2SDK;
  
  2.获取JUnit V3.8.1(从http://www.junit.org获取开发包);
  
  3.获取JMock V1.0(从http://www.jmock.org获取JMock开发包)。
  
  4.为了开发方便,建议使用一个好IDE。以下例子中的代码均是在Eclipse V3.0环境下进行的调试。
  
  例子一
  以下是一个简单例子,代码如下:
  
  package test1;
  
  import org.jmock.*;
  
  import javax.servlet.http.*;
  
  public class MockRequestTest extends MockObjectTestCase{
  
  public void testMockRequest1(){
  
  //构造一个Mock对象
  
  Mock mock = new Mock(HttpServletRequest.class);
  
  //设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的
  
  //getParameter方法,传递的参数是"name",期望的返回是"kongxx"
  
  mock.eXPects(once()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));
  
  //根据Mock对象获取一个HttpServletRequest对象
  
  HttpServletRequest request = (HttpServletRequest)mock.proxy();
  
  //断言调用结果
  
  assertEquals("kongxx" ,request.getParameter("name"));
  
  }
  
  public void testMockRequest2(){
  
  //构造一个Mock对象
  
  Mock mock = new Mock(HttpServletRequest.class);
  
  //设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的
  
  //getParameter方法,传递的参数是"name",期望的返回是"kongxx"
  
  mock.expects(once()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));
  
  //根据Mock对象获取一个HttpServletRequest对象
  
  HttpServletRequest request = (HttpServletRequest)mock.proxy();
  
  //调用HttpServletRequest对象的方法
  
  request.getParameter("name");
  
  //验证执行结果
  
  mock.verify();
  
  }
  
  }
  
  编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。
  
  例子二
  MyClass需要测试的类,提供了两个方法getName和getPassWord,都使用HttpServletRequest作为输入参数并返回从HttpServletRequest中取得的参数,具体代码如下:
  
  package test2;
  
  import javax.servlet.http.*;
  
  public class MyClass {
  
  public String getName(HttpServletRequest request) {
  
  return request.getParameter("name");
  
  }
  
  public String getPassword(HttpServletRequest request) {
  
  return request.getParameter("password");
  
  }
  
  }
  
  TestMyClass测试类,其中构造了一个假的HttpServletRequest对象,用来测试MyClass中的getName和getPassword方法,代码如下:
  
  package test2;
  
  import org.jmock.*;
  
  import javax.servlet.http.*;
  
  public class TestMyClass extends MockObjectTestCase{
  
  private MyClass myclass ;
  
  private Mock mockRequest ;
  
  private HttpServletRequest request ;
  
  public void setUp() {
  
  myclass = new MyClass();
  
  //构造一个Mock对象
  
  mockRequest = new Mock(HttpServletRequest.class);
  
  //根据Mock对象获取一个HttpServletRequest对象
  
  request = (HttpServletRequest)mockRequest.proxy();
  
  }
  
  public void tearDown() {
  
  //TODO
  
  }
  
  public void testGetName(){
  
  //设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的
  
  //getParameter方法,传递的参数是"name",期望的返回是"kongxx"
  
  mockRequest.expects(atLeastOnce()).method("getParameter").with(eq("name")).will(returnValue("kongxx"));
  
  assertNotNull(myclass.getName(request));
  
  assertEquals("kongxx" ,myclass.getName(request));
  
  }
  
  public void testGetPassword(){
  
  //设置要执行的操作,以下设置表示要调用一次HttpServletRequest对象的
  
  //getParameter方法,传递的参数是"password",期望的返回是"123456789"
  
  mockRequest.expects(atLeastOnce()).method("getParameter").with(eq("password")).will(returnValue("123456789"));
  
  assertNotNull(myclass.getPassword(request));
  
  assertEquals("123456789" ,myclass.getPassword(request));
  
  }
  }
  
  编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。
  
  EasyMock
  简介
  预备
  1.获取J2SDK;
  
  2. 获取JUnit V3.8.1(从http://www.junit.org获取开发包);
  
  3.获取EasyMock V1.1(从http://www.easymock.org获取EasyMock开发包)。
  
  4.为了开发方便,建议使用一个好IDE。以下例子中的代码均是在Eclipse V3.0环境下进行的调试。
  
  例子一
  以下是一个简单例子,为了方便对比,这里重新实现了JMock例子一,代码如下:
  
  package test1;
  
  import org.easymock.*;
  
  import junit.framework.*;
  
  import javax.servlet.http.*;
  
  public class MockRequestTest extends TestCase{
  
  private MockControl control;
  
  private HttpServletRequest mockRequest;
  
  public void testMockRequest(){
  
  //创建一个Mock HttpServletRequest的MockControl对象
  
  control = MockControl.createControl(HttpServletRequest.class);
  
  //获取一个Mock HttpServletRequest对象
  
  mockRequest = (HttpServletRequest) control.getMock();
  
  //设置期望调用的Mock HttpServletRequest对象的方法
  
  mockRequest.getParameter("name");
  
  //设置调用方法期望的返回值,并指定调用次数
  
  //以下后两个参数表示最少调用一次,最多调用一次
  
  control.setReturnValue("kongxx" ,1 ,1);
  
  //设置Mock HttpServletRequest的状态,
  
  //表示此Mock HttpServletRequest对象可以被使用
  
  control.replay();
  
  //使用断言检查调用
  
  assertEquals("kongxx",mockRequest.getParameter("name"));
  
  //验证期望的调用
  
  control.verify();
  
  }
  
  }
  
  编译并将其当做一个Test Case运行,会发现两个测试方法均测试成功。
  
  例子二
  同例子一样,对JMock例子二重新实现产生了EasyMock的例子二。
  
  需要测试的类代码如下:
  
  package test2;
  
  import javax.servlet.http.*;
  
  public class MyClass {
  
  public String getName(HttpServletRequest request) {
  
  return request.getParameter("name");
  
  }
  
  public String getPassword(HttpServletRequest request) {
  
  return request.getParameter("password");
  
  }
  
  }
  
  测试类代码如下:
  
  package test2;
  
  import org.easymock.*;
  
  import junit.framework.*;
  
  import javax.servlet.http.*;
  
  public class TestMyClass extends TestCase{
  
  private MockControl control;
  
  private HttpServletRequest mockRequest;
  
  private MyClass myclass ;
  
  public void setUp() {
  
  myclass = new MyClass();
  
  //创建一个Mock HttpServletRequest的MockControl对象
  
  control = MockControl.createControl(HttpServletRequest.class);
  
  //获取一个Mock HttpServletRequest对象
  
  mockRequest = (HttpServletRequest) control.g
上一篇:如何用SQL生成SQL批处理文件的方法 人气:506
下一篇:权限系统:分散实现、关注变化 人气:537
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号