1. 首页
  2. 编程语言
  3. Java
  4. Jmock学习手册

Jmock学习手册

上传者: 2020-07-29 03:47:47上传 PDF文件 399.76KB 热度 26次
Jmock学习手册,让你更快学习Jmock。。Mock guideline——基于 JEster框架的Mock实践总结Mock基础知识为什么要Mock因为单元测试当中,我们只关注被测的单元,而不关心其他的依赖内容。比如我们测试的一段诚保帐户关闭的逻辑,需要调用远稈接口査询CRM的帐户信息,需要査询本地数据库中的递延数据,需要发送异步消息通知其他应用诚保状态变化一一这些都是外部依赖。但是我们关注的却是服务方法这个单元中业务的内部流转过程,比如在所有外部环境都正常的情况下,我们拿到一种帐户信息、查询到递延记录、应该如何做出反应,而后应该通知给其他应用什么信息内容。我们并不关心,如何去获取帐户信息、递延记录、异步消息发送的具体过程所以我们需要屏蔽掉这些外部依赖。Mock让我们有了一套仿真的环境,不用担心在检查单元内的内部流转的过程时还会因为环境的关系导致验证过程失败。当然,最后需要给出的銈议是:由于外部环境的多样化性,单元测试应该设计些异常场景,比如远程接口超时拋岀早常,我们的单元中应该有相应的处理机制,以免真实环境中真的出现环境问题,我们的应用呈现出非常脆弱的一面2.如何引入Mock1.引入 jmockit包,添加到工程的 pom. xm中!- morkit依赖包groupld>com. alibaba. external/groupld>rtifactld>test. jmockits/artifactld>0.998/dependency2.Mock第一个实例, Hello world!Mock guideline——基于 JEster框架的Mock实践总结public class Demo Test extends Testcase ic mock外部服务@MockedDemoservice demoservicepublic void testserviceO[new ExpectationsdemoService getMsgresult="Hello world!∥最简单的测试 Hello worldassertEqualsdemo Service. getMsg(, Hello world!")接口类interface Demo Service*测试消息returnString getMsg(;以上是基于 Jun it的mock实例,后面例子都将结合现有的 JEster的框架。如何在框架中引入 TEster框架,参照 JEster使用详解介绍3. record- replay- verify模型经典的测试模型都是分成三个阶段: Arrange、Act、 Assert(AAA)。1、 Arrange阶段:数据或者依赖的服务的准备和注入2、Act阶段:目的测试执行3、 Assert阶段:把执行完的测试结果和期望值进行比较。示例:aTestpublic void testMethod o1. Preparation: whatever is required before the unit under test can beexercised7/2. The unit under test is exercised, normally by calling a non-private me thod7 or constructor4Mock guideline——基于 JEster框架的Mock实践总结7/3. Verification: whatever needs to be checked to make sure the exercised unit同样的,基于行为的Mock测试,同样也是基于类似的三个阶段: record、 replay、 verify.1、 record:在这个阶段,各种在实际执行中期望被调用的方法都会被录制。2、 repaly:在这个阶段,执行单元测试Case,原先在 record阶段被录制的调用都可能有机会被执行到。这里有“有可能”强调了并不是录制了就一定会严格执行。3、 verify:在这个阶段,断言测试的执行结果或者其他是否是原来期望的那样。public class CaseTesL extends JTesler taMockcoSubservice subservicedTestpublic void tes-Service()inew Expectaions((subService. sayoverrideNethod(erifywantstring suDservice, sayeverrldeMetnod)isEqualTo("mock")i当然,这个例子只是众多Mock样式中的一个。4.Mock普通公有方法工作中最常用的就是Mock一个接口或者实现类的公有方法,下面一步一步展示简单的Mock:业务类Demo1 Service javapublic interface Demo1Service i/本本测试返回值为字符串类型String sayName(/*测试返回值为int类型*savage测试返回值为 boolean类型*boolean isTp()务实现类Demo1 Servicelmpl」ava5Mock guideline——基于 JEster框架的Mock实践总结public class Demo1ServiceImpl implements Demo1Service/)务类中依赖的DAO需要Mock摔,详见Mock场景1private demo1dAo demo1DA0:@Overridepublic boolean isTpofdemo1DAO isTp@Overridepublic int sayAge(ireturn demo1DAOgetAge(@Overridepublic Stringreturn demo1DAO.getName(;public void setDemo1DAO(Demo1DAO demoldaodemo1dao= demo1dao3.Mock场景1:测试Demo1 Service服务类, Mock em。1DAo类所有方法,如下Mock guideline——基于 JEster框架的Mock实践总结@Spring Application Context("application Context. xml")public class Demo1Service Test extends tEster i@ Spring bean Byname在容器中根据名称查询bean为 demol service的 service注入Demo1Service demo1service∥不指定具体的方法,将全部mock@Mocked@ Spring Bean For/注入 Demoldao到容器中DemoldAodemold∥不录具体方法返回值,返回默认的mock值aTestpublic void testService default twant. stringldemo1service say Name o).isNullotringldemo1snAme () isnull(want number(demo 1 Service.sayage(). isequalTo(o)ant bool(demo1service. isTp(). isequalTo():/mock类默认返冋值,应用Java数据类型初始化默认值oBject=null, int=0, boolean= false, long=OL, float=0.0F, double=0.ODaTestpublic void testservice(i∥录制期望返回值,根据调用情况录制方法,严格按照凋用方法的顺利与次数new Expectations(demo1DAO. getName0esult="ndemo1DAO.getAge(;esult=18want string demo1Service say(). isequalTo mayun)want number(demo 1 Service. say age()) isEqual To(18);*此处用笫一次,将会抛出异常,不可遏知的调用异常。va lang Assertion Error: Unexpected invocation of: int//want number(demo1Service sayAge(). isequalTo(18)*isTp方法没有录制,将会抛出异常,不可遇知的调用异常java. lang Assertion Error: Unexpected invocation of: int//want bool(demo1Service isTp()is EqualTo(false);7Mock guideline——基于 JEster框架的Mock实践总结4.Mock场景2:测试 Demo1service服务类, Mock DemolDAO类部分方法,如下:@SpringApplication Contexti"application Context. xml")public class Demo1 1Service Test extends JEster i@Spring Bean bynaDemo1service demo1service*nock方法,道过显小的添加 Mocked( methods={" filter"," filter2",…}, Inverse= -true/false)来实现。 filter就是方法名称,这个标签指定只有符合 filter规则的方法才会被Mock,不符合的还是按照原艽的实现执行。 Inverse为true,刚好相反,说明除了 methods的方法外,其他的方法都是被Mock的。@ )Mocked methods标签同时支持正则@Mocked(methods=I"getName","getAge"b@Spring Bean ForDemoldaodemo1dao:*测试具体实现类Testblic void tests录制方法,根据调用情况录制方法,严格按照调用方法的顺利与次数w Expectationsdemo1DAO. getNameoresultdemo1DAO. getAge (;result =18:want string demo1service say Name (). isequalTo" xiaoming");rant. number(demo 1 Service. say Ageo). isEqualTo(18)*isTp方法,没有指定必须mock,可以随意调用.
下载地址
用户评论
码姐姐匿名网友 2020-07-29 03:47:47

很好的入门学习手册,已收下了,谢谢分享