`
llyzq
  • 浏览: 583601 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

什么是mock测试

阅读更多

转自http://tech.chinaunix.net/a2009/1110/806/000000806622_2.shtml

mock测试:就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

  mock对象:这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。

  mock对象使用范畴:

  真实对象具有不可确定的行为,产生不可预测的效果,(如:股票行情,天气预报)

  真实对象很难被创建的

  真实对象的某些行为很难被触发

  真实对象实际上还不存在的(和其他开发小组或者和新的硬件打交道) 等等...

  使用mock对象测试的关键步骤:

  使用一个接口来描述这个对象

  在产品代码中实现这个接口

  在测试代码中实现这个接口

  在被测试代码中只是通过接口来引用对象,所以它不知道这个引用的对象是真实对象还是mock对象。

  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

 

 

分享到:
评论

相关推荐

    mock 测试.pptx

    什么是 Mock 测试? -------------------- Mock 测试是一种软件测试方法,旨在模拟一些难以构造或获取的对象,以便进行测试。在测试过程中,Mock 对象可以帮助开发者更好地测试单元测试、集成测试和系统测试。Mock ...

    基于python的mock测试数据练习

    本练习主要关注如何使用 `unittest.mock` 进行mock测试数据。 一、Mock对象的基本概念 Mock对象是模拟真实对象的一种工具,它可以在测试中替代真实的对象,以避免测试过程中对实际数据或外部服务的依赖。Mock对象...

    详解Spring MVC如何测试Controller(使用springmvc mock测试)

    **什么是Mock测试?** Mock测试是一种软件测试技术,它允许在不依赖真实环境或第三方组件的情况下测试代码。在测试过程中,我们创建模拟对象(Mock Objects)来替代那些难以构造或控制的对象,比如在Spring MVC中,...

    服务端Mock测试基础原理讲解

    服务端Mock测试是一种在软件开发中广泛应用的技术,它允许测试工程师在没有依赖服务端的真实环境或者服务尚未完成时进行测试工作。Mock技术通过模拟真实的服务端行为,使得测试人员能够在本地模拟各种网络交互,从而...

    iview.test测试demo包含拖拽排序 mock测试 iview模板

    Mock测试则是一种在真实后端服务未完成或不可用时,模拟后端数据来测试前端应用的方法。 本项目"iview.test测试demo"显然是一个基于Vue.js和Iview的实践示例,其中包含了拖拽排序的功能。拖拽排序是一种用户交互...

    支持http接口自由mock,可根据需要进行接口mock测试。

    对于“支持http接口自由mock,可根据需要进行接口mock测试”这一主题,我们可以深入探讨一下HTTP接口Mocking的概念、重要性以及如何使用工具如Moco进行实践。 HTTP接口Mocking是软件开发过程中的一个重要环节,特别...

    单元测试与 Mock 方法

    Mock方法则是单元测试中的一个重要工具,用于模拟复杂系统中的依赖关系,以便孤立地测试目标代码。在本篇文章中,我们将深入探讨单元测试与Mock方法的相关知识点。 首先,让我们理解单元测试的基本概念。单元测试是...

    junit单元测试及Mock应用,超详细的PPT实战应用

    通过使用Mockito,开发者可以指定Mock对象在接收到特定方法调用时返回什么值,或者验证方法是否被正确调用。Mockito的@Mock注解用于创建Mock对象,@When注解用于配置Mock对象的行为,@Verify注解则用于确认方法调用...

    我们用到的3种Mock测试方案​.docx

    【Mock测试方案详解】 在软件测试中,Mock测试是一种常用的技术,它允许我们在不依赖真实外部服务的情况下,模拟特定的依赖行为,以便更好地控制测试环境并确保测试的隔离性。以下是我们采用的三种Mock测试方案: ...

    Squaretest半自动生成Mock测试

    "Squaretest半自动生成Mock测试"是一个针对这个需求的工具,它旨在简化单元测试的创建过程,特别是对于那些需要模拟(Mock)外部依赖的场景。 单元测试通常包括三个主要部分:测试前的设置(SetUp),实际的测试...

    Mock

    Mock技术在软件开发中扮演着重要的角色,尤其是在测试领域。它允许开发者在不依赖实际环境或第三方服务的情况下,创建模拟对象来代替真实组件,以便进行单元测试和集成测试。这样可以提高测试效率,减少测试复杂性,...

    java单元测试 spring mock的使用

    "Java单元测试Spring Mock的使用" 在Java Web应用中,单元测试是非常重要的一步,它可以帮助开发者检测代码的正确性和可靠性。传统的单元测试方法需要部署到容器中,然而,这种方法存在一些缺陷,例如需要长时间的...

    mockServer,mock服务端

    MockServer 是一个强大的工具,主要用于在开发过程中模拟服务器行为,特别是在接口开发和测试阶段。它允许开发者在没有实际后端服务的情况下,创建模拟的HTTP和HTTPS服务器,以便于快速验证前端代码或者自动化测试。...

    googlemock库附使用教程

    首先,我们来理解什么是Google Mock。Google Mock允许开发者创建模拟对象,这些对象可以模拟复杂的依赖关系,以便在测试中隔离被测代码。这样,即使被测试对象依赖于其他难以控制或不存在的组件,我们也能准确地测试...

    单元测试MockBean和SpyBean的简单用法

    在这个过程中,MockBean和SpyBean是两种常用的工具,它们可以帮助我们创建模拟对象(Mocks)和部分模拟对象(Spies),以便在测试中控制依赖关系。下面将详细介绍MockBean和SpyBean的使用方法及其在单元测试中的作用...

    mock

    在Struts2中,有多种方式来实现Mock测试: 1. `junit怎么测试struts里的Action.htm`:这个文件名暗示了如何使用JUnit进行Struts2 Action的测试。JUnit是Java开发中最常用的单元测试框架,可以配合Mockito或EasyMock...

    Mock是一个零侵入的服务端Mock平台,底层基于JVM Sandbox。相比于Fiddler、-mock-fe.zip

    总的来说,Mock平台是服务端开发和测试的强大助手,通过零侵入的设计和JVM Sandbox的安全保障,它可以提供灵活且可控的模拟服务,帮助团队提高开发效率,减少对实际服务的依赖,并促进更好的协作。而`mock-fe-master...

    mock测试简介及演示(源码+ppt)

    Mock测试是一种测试思想,那就是通过模拟的手段提高模块的可测试性。测试性不强的模块是软件工程质量的大敌。 本资源位mock测试的简介及简单示例,使用android mock objects实现了模拟android MediaStore的功能。

    JMOCKIT mock 静态方法 单元测试

    可以用来Mock JAVA代码中的静态方法

Global site tag (gtag.js) - Google Analytics