转载:https://blog.csdn.net/qq_30141957/article/details/81273829

项目中,有些函数需要处理某个服务的返回结果,而在对函数单元测试的时候,又不能启动那些服务,这里就可以利用Mockito工具。Mockito中的Mock和Spy都可用于拦截那些尚未实现或不期望被真实调用的对象和方法,并为其设置自定义行为。二者的区别在于:

1、Mock声明的对象,对函数的调用均执行mock(即虚假函数),不执行真正部分。

2、Spy声明的对象,对函数的调用均执行真正部分。

例:

  1.  
    public class Main {
  2.  
     
  3.  
    public void fun(String s) {
  4.  
    System.out.println(s + " : fun");
  5.  
    fun1(s);
  6.  
    fun2(s);
  7.  
    }
  8.  
     
  9.  
    public void fun1(String s) {
  10.  
    System.out.println(s + " : fun1");
  11.  
    }
  12.  
     
  13.  
    private void fun2(String s) {
  14.  
    System.out.println(s + " : fun2");
  15.  
    }
  16.  
     
  17.  
    public int getVal(){
  18.  
    return 5;
  19.  
    }
  20.  
    }

Mock使用实例

1、使用doCallRealMethod().when()调用函数真正部分。

2、使用when().thenReturn自定义函数返回值。

  1.  
    import static org.mockito.ArgumentMatchers.anyString;
  2.  
    import static org.mockito.Mockito.doCallRealMethod;
  3.  
    import static org.mockito.Mockito.when;
  4.  
     
  5.  
    import org.junit.Before;
  6.  
    import org.junit.Test;
  7.  
    import org.mockito.Mock;
  8.  
    import org.mockito.MockitoAnnotations;
  9.  
     
  10.  
    public class MainTest {
  11.  
     
  12.  
    @Mock
  13.  
    Main mockMain;
  14.  
     
  15.  
    @Before
  16.  
    public void init() {
  17.  
    MockitoAnnotations.initMocks(this);
  18.  
    }
  19.  
     
  20.  
    @Test
  21.  
    public void testFun() {
  22.  
    // 执行mock,而不是真正部分,所以没有打印任何信息
  23.  
    mockMain.fun("mock test One");
  24.  
     
  25.  
    // doCallRealMethod声明后,执行真正部分
  26.  
    // 但是Mock只能对public(fun1)和protected函数进行mock
  27.  
    // 对private函数(fun2)仍执行真正部分
  28.  
    // 所以输出fun和fun2
  29.  
    doCallRealMethod().when(mockMain).fun(anyString());
  30.  
    mockMain.fun("mock test Two");
  31.  
     
  32.  
    // 执行mock,输出int的默认值0,而不是5
  33.  
    System.out.println("val: " + mockMain.getVal());
  34.  
    // when声明后,既不走真正部分,也不走mock,直接返回thenReturn()中定义的值
  35.  
    // 注意:该值的类型需要和when中函数返回值类型一致
  36.  
    when(mockMain.getVal()).thenReturn(10);
  37.  
    System.out.println("val: " + mockMain.getVal());
  38.  
    }
  39.  
     
  40.  
    }

Spy使用实例

1、使用when().thenReturn自定义函数返回值。

  1.  
    import static org.mockito.Mockito.when;
  2.  
     
  3.  
    import org.junit.Before;
  4.  
    import org.junit.Test;
  5.  
    import org.mockito.MockitoAnnotations;
  6.  
    import org.mockito.Spy;
  7.  
     
  8.  
    public class MainTest {
  9.  
     
  10.  
    @Spy
  11.  
    Main spyMain;
  12.  
     
  13.  
    @Before
  14.  
    public void init() {
  15.  
    MockitoAnnotations.initMocks(this);
  16.  
    }
  17.  
     
  18.  
    @Test
  19.  
    public void testFun() {
  20.  
    // 执行真正部分
  21.  
    spyMain.fun("mock test One");
  22.  
     
  23.  
    // 执行真正部分
  24.  
    System.out.println("val: " + spyMain.getVal());
  25.  
    // 自定义返回值
  26.  
    when(spyMain.getVal()).thenReturn(10);
  27.  
    System.out.println("val: " + spyMain.getVal());
  28.  
    }
  29.  
    }


参考文章:

1、mockito中实现部分mock两种方式

2、@mock和@spy在mock私有方法的区别,使用@spy模拟私有方法进行测试时sonar统计是有覆盖率的

3、Mockito的参数匹配

单元测试Mockito中的Mock和Spy的更多相关文章

  1. Mockito中的@Mock和@Spy如何使用

    相同点 spy和mock生成的对象不受spring管理 不同点 1.默认行为不同 对于未指定mock的方法,spy默认会调用真实的方法,有返回值的返回真实的返回值,而mock默认不执行,有返回值的,默 ...

  2. 单元测试系列之五:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

  3. mockito中两种部分mock的实现,spy、callRealMethod

    什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现). 为什么需要部分mock? A:当需要测试一个 ...

  4. Mockito中@Mock与@InjectMock

    Mockito是java单元测试中,最常用的mck工具之一,提供了诸多打桩方法和注解.其中有两个比较常用的注解,@Mock和@InjectMock,名字和在代码中使用 的位置都很像,对于初学者,很容易 ...

  5. 单元测试:单元测试中的mock

    公司要求提升单元测试的质量,提高代码的分支覆盖率和行覆盖率,安排我研究单元测试,指定方案分享并在开发部普及开.整理完资料后,同步一下到博客. 单元测试中的mock的目的 mock的主要目的是让单元测试 ...

  6. 使用Mockito进行单元测试【1】——mock and verify[转]

    本文转自:http://qiuguo0205.iteye.com/blog/1443344 1. 为什么使用Mockito来进行单元测试? 回答这个问题需要回答两个方面,第一个是为什么使用mock?m ...

  7. Mockito 中文文档 ( 2.0.26 beta )

    Mockito 中文文档 ( 2.0.26 beta ) 由于缺乏校对,难免有谬误之处,如果发现任何语句不通顺.翻译错误,都可以在github中的项目提出issue.谢谢~ Mockito框架官方地址 ...

  8. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  9. 【转】利用Python中的mock库对Python代码进行模拟测试

    出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...

随机推荐

  1. STM32 GPIO fast data transfer with DMA

    AN2548 -- 使用 STM32F101xx 和 STM32F103xx 的 DMA 控制器 DMA控制器 DMA是AMBA的先进高性能总线(AHB)上的设备,它有2个AHB端口: 一个是从端口, ...

  2. 找不到包含 OwinStartupAttribute 的程序集

    配置一个 MVC 项目时 遇到的  vs 2013 解决办法:在 webconfig 中 <appSettings> <add key="owin:AutomaticApp ...

  3. socket recv阻塞与非阻塞error总结

    recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结. 首先阻塞接收的re ...

  4. [Git]git教程

    摘要 目前公司项目逐渐都要迁移到git上,使用git进行版本控制及源代码管理. git学习资料 一个小时学会Git 权威Git书籍ProGit(中文版) git官网:http://git-scm.co ...

  5. 用Qemu搭建x86_64学习环境

    作者信息 作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 软件平台 主机: Ubuntu14.04 64位版本 模拟器:Qemu-2.8.0 Linux内核 ...

  6. cocos2d-x retain和release倒底怎么玩?

    转载请注明,原文地址: http://blog.csdn.net/musicvs/article/details/8689345 正文: 1. 为什么会有retain? C++和Java不一样,Jav ...

  7. Netty4.0学习笔记系列之四:混合使用coder和handler

    Handler如何使用在前面的例子中已经有了示范,那么同样是扩展自ChannelHandler的Encoder和Decoder,与Handler混合后又是如何使用的?本文将通过一个实际的小例子来展示它 ...

  8. Oracle数据库(一)

    Oracle 是一个数据库管理系统,是Oracle公司的核心产品.其在数据安全性与安整性控制方面的优越性能,以及跨操作系统.跨硬件平台的数据操作能力.基于“客户端/服务    器”(Client/Se ...

  9. Scala从零開始:使用Intellij IDEA写hello world

    引言 在之前的文章中,我们介绍了怎样使用Scala IDE也就是eclipse中集成的Scala开发插件来进行Scala语言程序的开发,在使用了一段时间之后,发现eclipse对Scala的支持并非非 ...

  10. nodeJS 相关开源项目

    摘要:NodeJS是一个服务器端JavaScript解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码 ...