服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

mock概述以及用mockobject进行测试


  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

扫描关注微信公众号