ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:21.27KB ,
资源ID:5227584      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5227584.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Mock 对象 创建高效灵活的测试用例文档格式.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

Mock 对象 创建高效灵活的测试用例文档格式.docx

1、通过EasyMock,开发或测试人员能够比较方便的创建Mock对象,在一定程度上减少了创建Mock对象所带来的工作量。2.EasyMock使用示例EasyMock的使用方法和原理的详细说明请参见EasyMock使用方法和原理剖析一文。在这里,我们仅以HttpServletRequest为例对EasyMock的功能做简单说明。在部署到Servlet容器之前,需要和HttpServletRequest进行交互的模块可以通过构建Mock对象的方式进行单元测试。下面是使用EasyMock(version 2.3)构建Mock对象进行简单测试的例子:public class HttpServletReq

2、uestUtilpublic static boolean validate(HttpServletRequest request)String host=request.getHeader(Host);return host.startsWith(public class HttpServletRequestTestCase extends TestCasepublic void testHttpSevletRequest()HttpServletRequest mockRequest=createMock(HttpServletRequest.class);mockRequest.getH

3、eader(expectLastCall().andReturn(:80).times(1);replay(mockRequest);assertTrue(HttpServletRequestUtil.validate(mockReq uest);verify(mockRequest);首先,我们通过EasyMock提供的静态方法createMock创建Mock对象mockRequest。当Mock对象创建好以后,我们就可以对Mock对象的预期行为和输出进行设定。对预期行为和输出的设定分成两个部分:(1)对指定方法进行调用;(2)对预期输出进行设定。在上例中,mockRequest.getHe

4、ader(对Mock对象的getHeader方法进行了调用,之后用expectLastCall().andReturn().times(1)对Mock对象的预期输出进行了设定。andReturn方法设定了当getHeader方法被调用时,将返回字符串,times方法设定了该方法预期被调用的次数是1。在结束对Mock对象预期行为和方法的设定之后,我们可以调用replay静态方法将mockRequest对象切换成回放状态。在回放状态下,Mock对象的方法调用将返回预先设定的输出。在上例中,HttpServletRequestUtil类的validate方法对mockRequest的getHeade

5、r方法进行了调用,并对得到的值进行验证。最后,我们可以用verify方法来验证预期方法的调用是否真的完成了。假如将上例中expectLastCall().andReturn().times(1)设定的调用次数修改为2,而实际测试中只调用了一次该方法,您将会看到以下的错误:通过示例,我们了解了EasyMock的使用方法。EasyMock能为单元测试提供了一定的便利,然而,它也有一些明显的不足之处:测试数据和预期结果以编码的形式写在测试用例中,测试数据的任何微小变化都会导致代码的重新编译和部署;被测试模块所包含的方法和参数硬编码在测试代码中,方法或参数的变化将导致所有相关测试代码的修改(例如Htt

6、pServletRequest中的参数经常会在开发过程中发生改变,这会影响大量测试代码);单元测试的测试过程包含在测试代码中,当测试用例发生变化,测试代码有可能需要全部重写,造成代码的频繁修改和引入错误的机会。3.利用XML文件配置Mock对象为了改进目前EasyMock使用方法中存在的不足,我们需要引入配置文件来对Mock对象进行定义。我们的目标是通过配置文件的使用来实现测试代码和数据的分离。当开发人员由于测试用例的变化而需要改变Mock对象的测试行为时,就可以直接对配置文件作出改动,而无需修改测试代码。构建Mock对象需要以下两方面的信息:(1)Mock对象对应的接口或类信息;(2)Moc

7、k对象的预期行为与输出。如果将以上两类信息配置在文件中,通过对配置文件的解析来构造Mock对象,就可以实现测试代码和数据分离的目标,从而改进现有Mock对象构造方法中的不足。本文在提出使用配置文件定义Mock对象这一机制的同时,也提供了一个基于EasyMock的实现。我们将这一实现称为XMLEasyMock。XMLEasyMock的完整实现和相关的测试代码都可以在xmleasymock.zip中找到。如果您使用Eclipse作为IDE,那么您可以将它导入您的Workspace(如下图):在XMLEasyMock中,我们选用XML文件作为Mock对象的配置文件,XML文件的自定义和结构特性使得它

8、成为描述Mock对象最佳的选择。根据以上对Mock对象信息配置的分析,我们可以给出Mock对象配置文件的模板:?xml version=1.0encoding=UTF-8mockConfig mockObjects mockObject name=Object namemockedClass=Mock class or interface/./mockObjects mockBehaviors mockBehavior mockObject=method=Expected invocation methodparamValues paramValue type=Parameter typeva

9、lue=Parameter value/paramValues ctrlOptions ctrlOption option=Control optionExpected return valuetimes=Expected invocation times/ctrlOptions/mockBehavior/mockBehaviors/mockConfig其中,mockObjects部分将配置Mock对象的生成信息,mockBehaviors部分将配置Mock对象的预期行为和输出。印花税会计分录接下来,我们将对这两部分进行详细的说明。根据配置文件生成Mock对象配置文件中所包含的Mock对象生成

10、信息包含在mockObject元素当中。mockObject元素包含两个属性name和mockedClass,分别对应Mock对象的名称和对应的接口或类。Mock对象的名称用于和配置文件中的其它部分相关联,而对应的接口和类用于Mock对象的生成。ResultSet接口是每个Java开发人员都非常熟悉的接口。以java.sql.ResultSet接口为例,为其生成一个Mock对象mockResultSet,可以在文件中配置为:mockObject name=mockResultSetjava.sql.ResultSet/我们可以设想一下,在EasyMock中,如果我们需要创建ResultSet接

11、口的一个Mock对象,这个过程应当是:IMocksControl mocksControl=EasyMock.createControl();ResultSet mockResultSet=control.createMock(ResultSet.class);其中,IMocksControl接口的实例mocksControl能生成并管理多个Mock对象。在XMLEasyMock中,我们为每个Mock对象创建一个MockObject类的对象,同时用一个MockObjectController对象来管理这些Mock对象。MockObjectController类拥有一个IMocksControl

12、成员变量,同时提供了replay、个人所得税计算器verify和reset方法,供外部调用(如下图):EasyMockUtil是提供给外部程序调用的工具类,loadConfig方法用于读取配置文件,findMockObjectByName方法可以通过Mock对象的变量名返回Mock对象。配置Mock对象的预期行为接下来我们需要配置的是Mock对象的预期行为。Mock对象的预期行为可以简单的理解为是Mock对象方法的调用以及该方法的预期输出。我们需要在文件中分别配置方法的预期调用和预期输出。Mock对象的预期方法调用配置在mockBehavior元素中。每个mockBehavior元素都包含两个

13、属性:mockObject和method属性。mockObject指定该行为对应的Mock对象的名称(Mock对象必须在mockObject中定义过),method属性则指定Mock对象中预期调用的方法。mockBehavior的子元素paramValues包含了需要配置的方法所对应的参数列表。paramValues的每个子元素paramValue都包含两个属性:type和value,分别指定了参数类型和参数值。我们以ResultSet接口的Mock对象mockResultSet为例,如果我们期望对getString方法进行调用,可以配置以下信息:在对Mock对象的方法调用进行配置以后,我们接

14、下来对方法的预期输出进行配置。方法的预期输出定义包含在ctrlOptions中。ctrlOption中的option属性指定了MockControl对象在指定方法返回值时选用的选项。Option属性可选的值包括:其中,andReturn选项用于设定方法的预期返回值,当option属性为andReturn时,我们可以在value属性中配置方法的返回值。在预期方法确定以后,其返回值类型也确定了,因此我们无需在此指定返回值类型。times属性用于指定预定方法的调用次数。如果希望为Mock对象方法设置默认的预期返回值,那么你可以选择andStubReturn,这时value属性中的返回值将作为预期方法

15、的固定返回值,而无需多次设定。andThrow选项用于设定预期异常抛出。当option属性为andThrow时,value属性用于指定预期的异常类型。times属性同样用于设定预期异常抛出的次数。如果希望为Mock对象方法设定默认的异常抛出,您可以相应的选择andSubThrow。如果预期方法的返回值为空(void),那么您应当指定andVoidCallable方法。这时value属性不用设定(如果设定,XMLEasyMock会忽略该属性)。我们仍然用ResultSet接口的getString方法为例,说明预期输出的配置效果:以上的配置相当于在EasyMock中调用:My return val

16、ueexpectLastCall().andThrow(new SQLException().times(2);XMLEasyMock中为每个Mock对象的预期行为创建一个MockBehavior对象。MockBehavior类中包含了两个列表,分别包含了多个ParamValue对象和CtrlOption对象。所有MockBehavior对象都由MockBehaviorController统一管理。MockBehaviorController提供了loadMockBehaviors和runMockBehaviors方法,分别用于读入MockBehavior和执行预期行为设定。这些类的关系如下图

17、所示:XMLEasyMock对Mock对象预期方法是通过类反射机制进行调用的。如图4所示,当MockBehavior的runMockMethod方法被调用时,它首先通过Mock对象名查询Mock对象,接着从ParamValue中取出用户设定的参数类型和参数值。根据Mock对象的类型、Mock对象的方法名和参数类型列表,我们可以通过Class的getDeclaredMethod获取到对应的Method对象。最后,runModkMethod方法调用Method对象的invoke方法,完成Mock对象预期方法的调用。在对预期方法进行调用之后,我们需要通过EasyMock类对方法的预期输出进行设定。我

18、们以设定预期返回值为例进行说明(设定预期异常抛出与此类似)。如图5所示,MockBehavior类提供了runCtrlOptions用于设定方法的预期输出。runCtrlOption方法首先调用之前得到的Method对象的getReturnType方法,获取方法的返回值类型,并将该返回值类型作为参数传递给CtrlOption的runCtrlOption方法。runCtrlOption方法首先调用EasyMock类的expectLastCall静态方法,获得Mock对象所对应的IMocksControl实例,之后,根据预期方法的返回值类型对配置文件中的返回值进行格式化,将格式化后的数据作为参数传

19、递给IMocksControl的andReturn方法,最后,调用times方法设定预期调用次数。以上是XMLEasyMock对Mock对象生成、Mock对象预期行为设定的具体实现。对于外部程序而言,只需要调用EasyMockUtil提供的loadConfig静态方法就可以达到根据配置文件构建Mock对象的目的了:EasyMockUtil的loadConfig方法MockObjectController的loadMockObjects方法和MockBehaviorController的loadMockBehaviors方法读取和创建Mock对象及其预期行为。MockBehaviorContro

20、ller的runMockBehaviors先后调用runMockMethod和runCtrlOptions方法设定Mock对象的预期方法调用和预期输出。最后,loadConfig方法调用MockObjectControllerreplay方法将Mock对象切换成Replay状态。4.利用Mock对象定义机制配置预期结果在进行单元测试时,被测试模块的预期结果也编码在代码中,当测试数据或是测试用例发生变化时,预期结果也将发生改变。我们是否能将预期结果也定义在配置文件中呢?我们可以将被测试的对象在正确运行的情况下的行为抽象为一个Mock对象,它的预期输出,就是被测试对象在正确运行情况下的预期输出。通

21、过这种方式,我们就可以用类似配置Mock对象的方式对预期结果进行配置了。在XMLEasyMock中我们提供了一个测试用的接口SalesOrder,它的实现类SalesOrderImpl的主要功能是从数据库中读取一个Sales Order的Region和Total Price,并根据读取的数据计算该Sales Order的Price Level:如果我们对getPriceLevel方法进行测试,就可以将该方法在正确运行下的预期输出抽象成Mock对象,并配置如下:mockSalesOrderxmleasymock.demo.test.SalesOrdergetPriceLevelparamValu

22、es/ctrlOptions ctrlOption option=andReturnexpected result 11ctrlOption option=expected result 2/mockConfig 5.使用配置文件运行测试用例与在代码中动态构建Mock对象不同,XMLEasyMock是在配置文件的解析过程中动态生成Mock对象的。因此,如果用户需要使用Mock对象,需要从解析模块中获取。XMLEasyMock提供了一个工具类EasyMockUtil,这个工具类提供了findMockObjectByName方法用于返回Mock对象。该方法的输入参数就是在配置文件的mockObje

23、ct元素中配置的name属性。另外,我们在上文中提到,EasyMockUtil提供了方法loadConfig用于装入配置文件,该方法的输入参数就是配置文件的路径。在XMLEasyMock提供的测试代码(SalesOrderTestCase.java)中,我们对ResultSet接口进行了模拟,从而对SalesOrder的getPriceLevel进行测试。在完成相关Mock对象的配置之后,我们可以通过XMLEasyMock提供的功能对测试用例实现如下:public class SalesOrderTestCase extends TestCasepublic void testAfterCon

24、fig()tryEasyMockUtil.loadConfig(/xmleasymock/demo/propert ies/mockConfig.xmlDBUtility mockDBUtility=(DBUtility)EasyMockUtil.findMockObjectByName(mockDBUtilityConnection conn=mockDBUtility.getConnection();Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(select*from sales_orderSale

25、sOrder realOrder=new SalesOrderImpl();SalesOrder mockOrder=(SalesOrder)EasyMockUtil.findMockObjectByName(while(rs.next()realOrder.loadDataFromDB(rs);assertEquals(realOrder.getPriceLevel(),mockOrder.getPriceLevel();EasyMockUtil.verify();catch(Exception e)e.printStackTrace();通常,在数据库连接模块中,开发人员都会开发一个类似于

26、DBUtitlity的实现来获取数据库连接以及释放数据库资源。在我们的测试用例中,这不是必需的,但为了对真实的开发和测试环境进行模拟,我们也在mockConfig.xml中对DBUtiltiy,Connection和Statement等接口进行了配置。我们通过DBUtility Mock对象的名称获得mockDBUtility对象,并通过它得到ResultSet的Mock对象。在对getPriceLevel方法进行测试时,我们将预期结果抽象成Mock对象,它在配置文件中的名称是mockSalesOrder。我们通过这个名称获得预期结果的Mock对象。最后,我们将实际结果和预期结果进行比对,从而完成测试。6.结论我们通过配置文件对Mock对象进行定义,实现了测试数据和代码的分离,从而避免了将数据编码在代码中所带来的一系列不便。当测试数据或是测试用例发生变化时,开发或部署人员只需对配置文件作出改动,而不用修改测试代码和重新编译、部署,降低了测试用例发生变化所带来的工作量和时间花销。本文基于EasyMock实现了通过配置文件定义Mock对象的机制。初入淘宝,别让代理商毁了你的店铺特别声明:1:资料来源于互联网,版权归属原作者2:资料内容属于网络意见,与本账号立场无关3:如有侵权,请告知,立即删除。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2