在写单元测试的时候,不免可能需要mock一些对象出来,并且mock一些方法调用去返回一个自己想要的对象。一般的使用是这样的:

FinalPumpkin pumpkin = mock(FinalPumpkin.class);
when(pumpkin.getName()).thenReturn("www.pkslow.com");

这样我们便可以自定义这个类getName()方法的返回,以达到我们测试特定情况的需要。

但假设可能我们要影响的是下面这样的返回结果呢?

pumpkin.getWeb().getFactory().getContainer().getHostname()

那可能我们就要先mock四个对象出来,然后再一层层mock方法的返回结果了。如下:

FinalPumpkin pumpkin = mock(FinalPumpkin.class);
Web web = mock(Web.class);
Factory factory = mock(Factory.class);
Container container = mock(Container.class); when(pumpkin.getWeb()).thenReturn(web);
when(web.getFactory()).thenReturn(factory);
when(factory.getContainer()).thenReturn(container);
when(container.getHostname()).thenReturn("www.pkslow.com");

这可够麻烦的。

幸好Mockito也想到这种情况,提供了解决办法,mock对象的时候增加参数RETURNS_DEEP_STUBS可以实现如下简洁办法:

@Test
public void testChainMethod() {
FinalPumpkin pumpkin = mock(FinalPumpkin.class, RETURNS_DEEP_STUBS);
when(pumpkin.getWeb().getFactory().getContainer().getHostname())
.thenReturn("www.pkslow.com");
verify(pumpkin.getWeb(), atLeastOnce());
}

注意:如果有返回值为泛型,会报ClassCastException的错误,这时需要拆开,把返回类型强制转换为Object类。


欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

Mockito如何mock一条链式调用的更多相关文章

  1. 玩一把JS的链式调用

    链式调用我们平常用到很多,比如jQuery中的$(ele).show().find(child).hide(),再比如angularjs中的$http.get(url).success(fn_s).e ...

  2. 基于JDK动态代理实现的接口链式调用(Fluent Interface)工具

    什么是链式接口(Fluent Interface) 根据wikipedia上的定义,Fluent interface是一种通过链式调用方法来完成方法的调用,其操作分为终结与中间操作两种.[1] 下面是 ...

  3. 如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用

    1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; ;i<arguments.length;i++){ v ...

  4. 【Java】子类的链式调用

    记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...

  5. hasOwnProperty 递归 简单回调 链式调用

    1.hasOwnProperty 函数的返回值为Boolean类型.如果对象object具有名称为propertyName的属性,则返回true,否则返回false. function Box(){ ...

  6. swift学习笔记之-可选链式调用

    //可选链式调用 import UIKit /*可选链式调用(Optional Chaining) 1.在可选值上请求和调用该可选值的属性.方法及下标的方法,如果可选值有值,那么调用就会成功,返回可选 ...

  7. Swift2.1 语法指南——可空链式调用

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  8. JavaScript设计模式——方法的链式调用

    方法的链式调用: (function() { //私有类 function _$ (els) { this.elements = []; for(var i = 0, len = els.length ...

  9. jQuery的XX如何实现?——2.show与链式调用

    往期回顾: jQuery的XX如何实现?——1.框架 -------------------------- 源码链接:内附实例代码 jQuery使用许久了,但是有一些API的实现实在想不通.于是抽空看 ...

随机推荐

  1. kubernetes的无状态服务和有状态服务介绍

    无状态服务 1)是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的 2)多个实例可以共享相同的持久化数据.例如: nginx实例和tomcat实例 3 ...

  2. Exercise

    """ 问:执行完下面的代码后, l,m的内容分别是什么? """ def func(m): for k,v in m.items(): m ...

  3. 开发一款图片压缩工具(三):使用 click 实现命令行

    上一篇实现了图片的压缩函数.现在如果需要对图片进行压缩,可以调用实现的函数进行压缩: pngquant_compress('elephant.png', force=True, quality=20) ...

  4. mysql5.7免安装版配置

    解压之后,新建一个my.ini 内容是: [mysql] # 设置mysql客户端默认字符集 default-character-set = utf8 [mysqld] #安装目录 basedir = ...

  5. php--static用法

    static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”. 如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“ ...

  6. JavaScript和php数组的定义

    JavaScript: var arr=[值1,值2,值3];                     //隐式创建 var arr=new Array(值1,值2,值3);      //直接实例化 ...

  7. android位运算简单讲解

    一.前言 在查看源码中,经常会看到很多这样的符号“&”.“|”.“-”,咋一看挺高大上:仔细一看,有点懵:再看看,其实就是大学学过的再普通不过的与.或.非.今天小盆友就以简单的形式分享下,同时 ...

  8. /sbin/mount.vboxsf: mounting failed with the error: Protocol error

    公司换了新电脑,需要把之前的虚拟机的配置全部备份下来,在移动的过程中挂载共享文件夹时候出现了 /sbin/mount.vboxsf: mounting failed with the error: P ...

  9. 打印js对象内容

    function writeObj(obj){ var description = ""; for(var i in obj){ var property=obj[i]; desc ...

  10. wincache 与 zend guard 的冲突

    ZendLoader.dll 与wincache.dll  同时开启 问题分析:zend与wincache冲突 解决方法: 关掉wincache: 在php.ini中的 extension=php_w ...