使用Mockito进行单元测试【2】—— stub 和 高级特性[转]
一篇中介绍了Mockito的基本信息,现在接着介绍Mockito强大的stub功能
2. Mockito使用实例
5. 对连续的调用进行不同的返回 (iterator-style stubbing)
还记得在实例2中说道当我们连续两次为同一个方法使用stub的时候,他只会使用最新的一次。但是在某一个方法中我们确实有很多的调用怎么办呢?mockito当然想到这一点了:
- when(mock.someMethod("some arg"))
- .thenThrow(new RuntimeException())
- .thenReturn("foo");
- //First call: throws runtime exception:
- mock.someMethod("some arg");
- //Second call: prints "foo"
- System.out.println(mock.someMethod("some arg"));
- //Any consecutive call: prints "foo" as well (last stubbing wins).
- System.out.println(mock.someMethod("some arg"));
当然我们也可以将第一句写的更简单一些:
- when(mock.someMethod("some arg"))
- .thenReturn("one", "two", "three");
参见网页例子10。
6. 使用回调进行stub【Stubbing with callbacks】
我们可以使用generic的Answer接口来让mock对象执行我们期望它执行的内容。比如我们可以查看调用方法的参数信息,并根据这个信息进行不同的处理,这可以使我们的stub变得十分的灵活。
- when(mock.someMethod(anyString())).thenAnswer(new Answer() {
- Object answer(InvocationOnMock invocation) {
- Object[] args = invocation.getArguments();
- Object mock = invocation.getMock();
- return "called with arguments: " + args;
- }
- });
- //Following prints "called with arguments: foo"
- System.out.println(mock.someMethod("foo"));
参见网页例子11。
7. 使用 doThrow()|doAnswer()|doNothing()|doReturn() 来 stub void方法
void方法也需要stub?呵呵,实际生活中我们应该只会用到doThrow来模拟这个void方法出错的情况吧,anyway,mockito提供了四个方法,发挥你的想象力吧:-)
- doThrow(new RuntimeException()).when(mockedList).clear();
- //following throws RuntimeException:
- mockedList.clear();
参见网页例子12。
8. 在真实的对象上进行spy
spy的意思是你可以修改某个真实对象的某些方法的行为特征,而不改变他的基本行为特征,这种策略的使用跟AOP有点类似。下面举一个例子来说明:
- List list = new LinkedList();
- List spy = spy(list);
- //optionally, you can stub out some methods:
- when(spy.size()).thenReturn(100);
- //using the spy calls <b>real</b> methods
- spy.add("one");
- spy.add("two");
- //prints "one" - the first element of a list
- System.out.println(spy.get(0));
- //size() method was stubbed - 100 is printed
- System.out.println(spy.size());
- //optionally, you can verify
- verify(spy).add("one");
- verify(spy).add("two");
可以看到spy保留了list的大部分功能,只是将它的size方法改写了。不过spy在使用的时候有很多地方需要注意,一不小心就会导致问题,所以不到万不得已还是不要用spy。下面介绍两个spy的陷阱:
【1】有时我们无法使用when的方式来spy,此时我们就需要使用doReturn|Answer|Throw() 等方式来进行spy了:
- List list = new LinkedList();
- List spy = spy(list);
- //Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
- when(spy.get(0)).thenReturn("foo");
- //You have to use doReturn() for stubbing
- 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 和 高级特性[转]的更多相关文章
- 基于Springboot+Junit+Mockito做单元测试
前言 前面的两篇文章讨论过< 为什么要写单元测试,何时写,写多细 >和<单元测试规范>,这篇文章介绍如何使用Springboot+Junit+Mockito做单元测试,案例选取 ...
- Rabbitmq之高级特性——百分百投递消息&消息确认模式&消息返回模式实现
rabbitmq的高级特性: 如何保障消息的百分之百成功? 要满足4个条件:生产方发送出去,消费方接受到消息,发送方接收到消费者的确认信息,完善的消费补偿机制 解决方案,1)消息落库,进行消息状态打标 ...
- ActiveMQ中的Destination高级特性(一)
---------------------------------------------------------------------------------------- Destination ...
- 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
- Python3学习(二)-递归函数、高级特性、切片
##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...
- 云端卫士实战录 | Java高级特性之多线程
<实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...
- javascript高级特性
01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...
- Visual Studio 2015 速递(4)——高级特性之移动开发
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- Android TextView高级特性使用
TextView一般都是用来显示一段文本,这里说的高级特性主要是一些我们平常不太常用的属性.包括文字阴影.自定义字体.html嵌入多格式.字体加粗.插入图片.这些特性平时开发APP的时候,可能一般使用 ...
随机推荐
- MapReduce(十五): 从HDFS阅读本文的源代码分析
以Map任务读取文本数据为例: 1) LineRecordReader负责对文件切割的定位,以及对读取每一行内容的封装供用户Map任务使用.每次在定位在文件里不为0的位置时,多读取一行,由于前一个 ...
- Ubuntu下搭建ASP.NET 5
在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要 ...
- ezjailserver备份和恢复方法
FreeBSD通过使用ezjail管理jails虚拟机非常方便.公司有多台ezjailsserver,执行n许多jails虚拟机,硬盘故障,做一个整体恢复.感性的方法如以下: 备份就绪: 暗示ezja ...
- CloudFoundry 中的GoRouter性能測试
之前一直感觉CloudFoundry的GoRouter的性能不靠谱,或者我们的CloudFoundry 部署架构存在问题,想着进行一些压力測试,可是一直苦于没有压力測试的工具.上一周,部门须要出一个測 ...
- 认识mongoDB数据库
mongodb中有三元素:数据库,集合,文档,其中“集合”对应关系型数据库中的“表”,“文档”对应“行”. 安装mongoDB: 去官网下载对应系统的mongoDB压缩包,解压后将文件夹重命名为mon ...
- BZOJ 3236 AHOI 2013 作业 莫队算法
题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...
- JAVA实现DAO基本层CRUD操作
随着shh2各种操作方便框架.越来越多JAVA WEB效率,可是,假设在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成非常多不是必需的资源浪费. 在项 ...
- 【Java 之 JVM】Java内存结构概述
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWl3dXpoaWxpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- poj 4088:Set操作
poj 4088:集合运算 题目:(至于4089.那个问题做过.使用归并思想,所以没有写) 描写叙述 小张须要从一批数量庞大的正整数中挑选出第k小的数.由于数据量太庞大,挑选起来非常费劲,希望你能编程 ...
- 阿里2015回顾面试招收学历(获得成功offer)
1. 引言 继上次"百度2015校园招聘面试题回顾录(成功拿到offer)"文章过后,大家都希望除了题目之外.最好能给出自己当时的回答情况,看看有没有什么回答技巧,这样更有參考价值 ...