well,说来惭愧,之前一直知道有这么个东西,但总是看不进去。刚好趁着这次迭代间隙有些闲暇,认真看了下,大概明白是怎么回事了。

首先,mock是个概念,这个词的本意就是“虚假的”、“模仿的”。在测试的时候,很多情况下都无法获取真正的对象,如Servlet对象,但测试又需要这个对象,怎么办?

当然是弄个假的给糊弄一下啦。

其次,mock的实现有很多,本文只关心Mockito,其他的请自行百度哈。

看到所有的资料都说Mockito有两方面的作用:1. 验证方法调用; 2. 指定特定条件下某个方法的返回值,或者执行特定的动作。

废话少说,直接上代码验证一下。

1. 先上pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>win.larryzeal</groupId><artifactId>mockito-study</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!--2.x not good 呵呵--><dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.10.19</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
</project>

2. 再提供一个接口 Processor,不提供实现。

package win.larryzeal.mockito.study;public interface Processor {void process();int get();void cb(int a, int b,  Callback cb);
}package win.larryzeal.mockito.study;public interface Callback {int onSuccess();int onFail();
}

3. 然后看一下怎么验证调用 - 需要特别指出的是,mock的对象相当于加了一层代理,可以认为是实现。如下:

package win.larryzeal.mockito.study;import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;//1. 验证方法调用
public class MockTest {@Testpublic void r1() {Processor mock = Mockito.mock(Processor.class);mock.process();//注意,这里相当于验证之前的调用!
        Mockito.verify(mock) //Alias to verify(mock, times(1))  验证是否调用一次
                .process();}@Testpublic void r2() {
Processor mock = Mockito.mock(Processor.class);mock.process();//注意,这里相当于验证之前的调用!
        Mockito.verify(mock, Mockito.times(3)) //Alias to verify(mock, times(1))  验证是否调用n次
                .process();}}

上面的验证很简单,就是验证指定mock的特定方法的调用 - 可以是调用次数,也可以是超时等,还可以是复合的验证条件,如Mockito.timeout(1000).times(3)。

4. 再来看看怎么定制特定方法的返回结果 - 很有用噢,特别是针对远程调用、接口调用等情况。

package win.larryzeal.mockito.study;import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;//2. 指定某个方法的返回值
public class MockTest {@Testpublic void r3() {Processor mock = Mockito.mock(Processor.class);//注意,这里相当于设定mock里某个方法的返回值!在测试遇到嵌套方法,且嵌套方法不便于调用时,非常有用。
        Mockito.when(mock.get()) .thenReturn(0xff); //这里是可变参数,多次调用的情况下,依次返回相应的数值;如果超出次数,返回最后一个值。System.out.println(mock.get());}}

嗯嗯,when用于指定调用的方法,thenXxx用于指定返回结果 或者 抛出异常。

5. 再来看看回调的情况 - 传入的参数是条件,根据条件来调用特定的回调。

package win.larryzeal.mockito.study;import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;//2. 指定某个方法的返回值,或者是执行特定的动作
public class MockTest {@Testpublic void r4() {Processor mock = Mockito.mock(Processor.class);//这里,是设定在特定条件下调用特定的回调! - 这个特定的条件是不同的参数,可以是具体的,也可以是Mockito.anyXxx。
        Mockito.doAnswer((InvocationOnMock invocation) -> {Callback cb = invocation.getArgumentAt(2, Callback.class);cb.onFail();return null; //嗯?这里的返回值是?
                }).when(mock).cb(Mockito.eq(1), Mockito.eq(-1), Mockito.any(Callback.class)); //TODO 如果用matcher,那所有的参数都需要是matcher//实际的调用mock.cb(1, -1, new Callback() {@Overridepublic int onSuccess() {System.out.println("ok");return 200;}@Overridepublic int onFail() {System.out.println("fail");return 500;}});mock.cb(1, 1, null);}}

前面设定条件,然后实际调用下,就是这么简单!

ps:暂时不明白那个Invocation的返回值是干嘛用的,稍后再说。

6. 最后看看 spy,Mockito 除了mock()方法,还提供了spy,简单的说就是可以不指定方法的返回值,而是返回类型的默认值(零值)。如下:

package win.larryzeal.mockito.study;import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;public class MockTest {@Testpublic void r5() {//spy,除非设定,返回返回默认值Processor spy = Mockito.spy(Processor.class);//多次调用的情况下,依次返回相应的数值;如果超出次数,返回最后一个值。//Mockito.when(spy.get()).thenReturn(3, 5, 9); //不指定的情况,返回0System.out.println(spy.get());System.out.println(spy.get());System.out.println(spy.get());System.out.println(spy.get());//同样可以校验执行次数
//        Mockito.verify(spy).get(); //一次Mockito.verify(spy, Mockito.times(4)).get();}}

ok,至此基本就算大功告成了,赶快去试试吧?

转载于:https://www.cnblogs.com/larryzeal/p/10915548.html

mockito的用法相关推荐

  1. mock java_JAVA的mock工具mockito简介

    在测试过程中,难免会碰到交互的外围系统不给力的情况,这时候mock就派上用场了,前段时间跟同学聊到这块的时候,他向我推荐mockito这个mock工具,试用了一下,确实很好用,这里给大家介绍下这款工具 ...

  2. linux打桩数框架,Mockito 单元测试打桩神器

    last modified by coder4 , 2019/08/30 18:34:26 Mockito 单元测试打桩神器 单元测试 软件测试是软件质量保证的关健环节,代表了需求.设计和编码的最终检 ...

  3. Android单元测试 - 几个重要问题

    前言 已经一个月没写文章了,由于9月份在plan国庆旅行计划,国庆前前后后去了14天旅行,所以没时间写,哈哈. 言归正传,上一篇文章<Android单元测试 - 如何开始?>介绍了几款单元 ...

  4. SpringBoot Testing

    前面我们对Mockito的用法有了一个了解,这里告诉大家一个好消息,SpringBoot已经帮我们继承了 这些框架,而且提供了更加简单好用的API. # 一.Mockito加载方式 前面我们说了两种加 ...

  5. Spock单测利器的写法

    Spock是国外的测试框架,其设计灵感来自JUnit.Mockito.Groovy,可以用于Java和Groovy应用的测试. Spock简介 最近发现了一款写法简洁高效,一个单测方法可以测试多组测试 ...

  6. python mockito arg_that_编程高阶用法–开发者高频词汇

    开发者总会在开发时遇到变量命名困难或者命名冗长庸俗的时候. 阅读代码过程中遇到一些很好的命名,也遇到一些不好的. 当初并没有记录下来,之后才开始记录,有的也找不到出处了.以下高频词汇供有追求的开发者参 ...

  7. mockito三种用法记录

    /**** @Type* @Desc* @Author Cristal* @Date 2020/12/30 11:42* @Version 1.0*/ @RunWith(SpringRunner.cl ...

  8. 如何使用Mockito模拟void方法

    如何用void返回类型模拟方法? 我实现了一个观察者模式,但是我不能用Mockito模拟它,因为我不知道怎么做. 我试图在互联网上找到一个例子,但没有成功. 我的课看起来像这样: public cla ...

  9. Mockito的使用(一)——@InjectMocks、@Spy、@Mock

    GItHub上有相应的翻译好的中文文档: https://github.com/hehonghui/mockito-doc-zh/blob/master/README.md#0 搭建Mockito测试 ...

最新文章

  1. 简易计算器 java_终于写出一个简单的计算器了
  2. 第二次Soring冲刺计划第一天(团队)
  3. unity打开一片黑_黑花儿和白花儿——记我家的两只猫星人
  4. 【MVC4升级到MVC5】ASP.Net MVC 4项目升级MVC 5的方法
  5. 矩阵分析 (五) 矩阵的分解
  6. 大集训的第二个小总结
  7. linux专业的打谱软件下载,MuseScore 3.1 发布,音乐制谱软件
  8. 计算机专业个人职业规划范文200字,计算机专业职业生涯规划范文
  9. ansys--workbench(导入solidworks)受力分析
  10. 第三次科技革命(一)
  11. curl怎么输出赋值_伺服电动缸怎么控制?
  12. 【算法】两矩形相交的判定
  13. 微信如何群发消息给好友和群:一键群发
  14. 【Unity3D】粒子系统ParticleSystem
  15. 还在为产品的客户服务而烦恼?来搭建在线客服中心!
  16. mininet-ovs转发行为与流表不对应
  17. 江苏省版权申请费用明细以及版权申报流程
  18. 全景管家在线解析720yun、蛙色中krpano全景图
  19. 2020年医药冷链物流行业报告
  20. 华为od机考真题-HJ95人民币转换(较难)

热门文章

  1. python练习:重新排列句子中的单词
  2. 编码员,程序员,黑客,开发人员和计算机科学家走进维恩图
  3. c语言中a 的用法,C语言中#define的用法
  4. 学籍管理系统c语言,c语言学籍信息管理系统设计
  5. 数据结构栈之中缀表达式求值(实现计算器综合计算)
  6. 66页3万字医疗行业大数据治理解决方案
  7. c语言中 mf什么意思,mf是什么意思(单反相机的对焦怎么用)
  8. 最牛逼的Java编辑器,没有之一!
  9. Python【pymysql】
  10. java web西蒙购物网 ——测试(test)