一篇中介绍了Mockito的基本信息,现在接着介绍Mockito强大的stub功能

2. Mockito使用实例

5. 对连续的调用进行不同的返回 (iterator-style stubbing)

还记得在实例2中说道当我们连续两次为同一个方法使用stub的时候,他只会使用最新的一次。但是在某一个方法中我们确实有很多的调用怎么办呢?mockito当然想到这一点了:

  1. when(mock.someMethod("some arg"))
  2. .thenThrow(new RuntimeException())
  3. .thenReturn("foo");
  4. //First call: throws runtime exception:
  5. mock.someMethod("some arg");
  6. //Second call: prints "foo"
  7. System.out.println(mock.someMethod("some arg"));
  8. //Any consecutive call: prints "foo" as well (last stubbing wins).
  9. System.out.println(mock.someMethod("some arg"));

当然我们也可以将第一句写的更简单一些:

  1. when(mock.someMethod("some arg"))
  2. .thenReturn("one", "two", "three");

参见网页例子10。

6. 使用回调进行stub【Stubbing with callbacks】

我们可以使用generic的Answer接口来让mock对象执行我们期望它执行的内容。比如我们可以查看调用方法的参数信息,并根据这个信息进行不同的处理,这可以使我们的stub变得十分的灵活。

  1. when(mock.someMethod(anyString())).thenAnswer(new Answer() {
  2. Object answer(InvocationOnMock invocation) {
  3. Object[] args = invocation.getArguments();
  4. Object mock = invocation.getMock();
  5. return "called with arguments: " + args;
  6. }
  7. });
  8. //Following prints "called with arguments: foo"
  9. System.out.println(mock.someMethod("foo"));

参见网页例子11。

7. 使用 doThrow()|doAnswer()|doNothing()|doReturn() 来 stub void方法

void方法也需要stub?呵呵,实际生活中我们应该只会用到doThrow来模拟这个void方法出错的情况吧,anyway,mockito提供了四个方法,发挥你的想象力吧:-)

  1. doThrow(new RuntimeException()).when(mockedList).clear();
  2. //following throws RuntimeException:
  3. mockedList.clear();

参见网页例子12。

8. 在真实的对象上进行spy

spy的意思是你可以修改某个真实对象的某些方法的行为特征,而不改变他的基本行为特征,这种策略的使用跟AOP有点类似。下面举一个例子来说明:

  1. List list = new LinkedList();
  2. List spy = spy(list);
  3. //optionally, you can stub out some methods:
  4. when(spy.size()).thenReturn(100);
  5. //using the spy calls <b>real</b> methods
  6. spy.add("one");
  7. spy.add("two");
  8. //prints "one" - the first element of a list
  9. System.out.println(spy.get(0));
  10. //size() method was stubbed - 100 is printed
  11. System.out.println(spy.size());
  12. //optionally, you can verify
  13. verify(spy).add("one");
  14. verify(spy).add("two");

可以看到spy保留了list的大部分功能,只是将它的size方法改写了。不过spy在使用的时候有很多地方需要注意,一不小心就会导致问题,所以不到万不得已还是不要用spy。下面介绍两个spy的陷阱:

【1】有时我们无法使用when的方式来spy,此时我们就需要使用doReturn|Answer|Throw() 等方式来进行spy了:

  1. List list = new LinkedList();
  2. List spy = spy(list);
  3. //Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
  4. when(spy.get(0)).thenReturn("foo");
  5. //You have to use doReturn() for stubbing
  6. doReturn("foo").when(spy).get(0);

比如我们使用when的时候实际已经调用了get(0)方法,这个时候将直接抛出异常,所以此时应该使用doReturn来进行spy

【2】spy实际上是对对象做了一个拷贝,就像上面的,如果我们直接看list这个对象,它实际上只执行了这样一句话List list = new LinkedList();

【3】 无法spy final方法。

参见网页例子13。

9. 其他高级特性

当说到高级特性,我们就是说那些基本用不到,但是当我们想用的时候就非常顺手的功能,比如:

# 改变没有stub方法的默认返回值  网页例子14

# 抓取参数进行assert验证  网页例子15

# 重置mock对象   网页例子16

由于浙西而使用机会比较小,这里就不详述了,更多的例子还是参考网页http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html

3.小结

不知看了以上的内容,你是否觉得Mockito是使用mock进行单元测试的理想工具,如果是的话,就猛击

http://code.google.com/p/mockito/的主页下载并使用吧:-)

本文转自:http://qiuguo0205.iteye.com/blog/1456528

使用Mockito进行单元测试【2】—— stub 和 高级特性[转]的更多相关文章

  1. 基于Springboot+Junit+Mockito做单元测试

    前言 前面的两篇文章讨论过< 为什么要写单元测试,何时写,写多细 >和<单元测试规范>,这篇文章介绍如何使用Springboot+Junit+Mockito做单元测试,案例选取 ...

  2. Rabbitmq之高级特性——百分百投递消息&消息确认模式&消息返回模式实现

    rabbitmq的高级特性: 如何保障消息的百分之百成功? 要满足4个条件:生产方发送出去,消费方接受到消息,发送方接收到消费者的确认信息,完善的消费补偿机制 解决方案,1)消息落库,进行消息状态打标 ...

  3. ActiveMQ中的Destination高级特性(一)

    ---------------------------------------------------------------------------------------- Destination ...

  4. 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙

    1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...

  5. Python3学习(二)-递归函数、高级特性、切片

    ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

  6. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

  7. javascript高级特性

    01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...

  8. Visual Studio 2015 速递(4)——高级特性之移动开发

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  9. Android TextView高级特性使用

    TextView一般都是用来显示一段文本,这里说的高级特性主要是一些我们平常不太常用的属性.包括文字阴影.自定义字体.html嵌入多格式.字体加粗.插入图片.这些特性平时开发APP的时候,可能一般使用 ...

随机推荐

  1. Hdu 3341 Lost&#39;s revenge (ac+自己主动机dp+hash)

    标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...

  2. windows API与C#的数据类型对应关系表

    API与C#的数据类型对应关系表 API数据类型 类型描述 C#类型 API数据类型 类型描述 C#类型 WORD 16位无符号整数 ushort CHAR 字符 char LONG 32位无符号整数 ...

  3. Palindromes&nbsp;_easy&nbsp;version

    Time Limit: 1Sec  MemoryLimit: 64 MB Submit:165  Solved: 76 [Submit][Status][WebBoard] Description & ...

  4. Web APi之认证

    Web APi之认证(Authentication)两种实现方式后续[三](十五)   前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不 ...

  5. android 视频通话开启呼叫等待后,来第三方的视频通话,接通后通话时间一直显示为0,过几秒之后视频通话自己主动挂断

    开启通话设置视频通话的"来电等待"; 步骤1:測试机和配合机A处于视频通话过程中; 步骤2:配合机B向測试机呼出视频电话; 步骤3:測试机接听配合机B的视频来电; 现象:视频通话过 ...

  6. 类似的微博推断客户关系sql声明

    类别似新浪微博的关注和共同关心 不知道别人是怎么设计的. 反正我是例如以下设计的 ID   USER   FRIEND 1     A         B 2      B         A 3   ...

  7. structs2注解+jsp+ajax实现post异步载入select

    流程: 1.点击载入btn发起异步请求post 2.后台处理请求返回数据 3.前端获取数据成功,对数据进行处理 前端: html:首先要导入jq包,不然怎么用ajax呢. <script typ ...

  8. Linux磁盘分区,目录树,文件系统的关系(转)

    研究了很久,自始至终不能够从三者的区别和联系中找到一个大脑与这些概念之间合适的相处方式.对于基本概念和理论理解不到位,在工作之中会走很多弯路和犯很多错误.今天花一天的时间,终于对三者的区别和联系有了更 ...

  9. 当向后台插入或读取JSON数据遇见回车时

    今天在项目中发现.当插入或读取JSON数据时遇见回车符.返回JSON数据格式时会报错(firebug里体现为乱码),百度了一下发现JSON不支持字符串里存在回车! 解决的方法: 在向接口插入带json ...

  10. 【微信公众平台开发】百度周边搜索接口php封装

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl2YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...