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 { @Test
public void r1() { Processor mock = Mockito.mock(Processor.class);
mock.process(); //注意,这里相当于验证之前的调用!
Mockito
.verify(mock) //Alias to verify(mock, times(1)) 验证是否调用一次
.process(); } @Test
public 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 { @Test
public 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 { @Test
public 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() {
@Override
public int onSuccess() {
System.out.println("ok");
return 200;
} @Override
public 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 { @Test
public void r5() { //spy,除非设定,返回返回默认值
Processor spy = Mockito.spy(Processor.class); //多次调用的情况下,依次返回相应的数值;如果超出次数,返回最后一个值。
//Mockito.when(spy.get()).thenReturn(3, 5, 9); //不指定的情况,返回0 System.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,至此基本就算大功告成了,赶快去试试吧?

mockito的用法的更多相关文章

  1. Mockito 的用法

    本文为博主原创,转载请注明出处: Mockito 是一个基于MIT协议的开源java测试框架. Mockito区别于其他模拟框架的地方主要是允许开发者在没有建立“预期”时验证被测系统的行为.对于moc ...

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

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

  3. Android 单元测试(junit、mockito、robolectric)

    1.运用JUnit4 进行单元测试 首先在工程的 src 文件夹内创建 test 和 test/java 文件夹. 打开工程的 build.gradle(Module:app)文件,添加JUnit4依 ...

  4. mock测试框架Mockito

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  5. 测试框架Mockito使用笔记

    Mockito,测试框架,语法简单,功能强大! 静态.私有.构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito. ...

  6. JUnit + Mockito 单元测试(二)

    摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...

  7. PowerMockito(PowerMock用法)

    网络上大部分是powermock 的用法, PowerMock有两个重要的注解: –@RunWith(PowerMockRunner.class) –@PrepareForTest( { YourCl ...

  8. powerMock比easyMock和Mockito更强大(转)

    powerMock是基于easyMock或Mockito扩展出来的增强版本,所以powerMock分两种类型,如果你习惯于使用easyMock的,那你就下载基于easyMock的powerMock,反 ...

  9. JUnit + Mockito 单元测试(二)(good)

    import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...

随机推荐

  1. django项目中使用邮箱找回密码功能

    本文使用qq邮箱,需要登录邮箱,在设置-账户里面开启SMTP服务,要记下授权码 前端html {#找回密码的表单#} <form action="" method=" ...

  2. Java8新特性(1)—— Stream集合运算流入门学习

    废话,写在前面 好久没写博客了,懒了,以后自觉写写博客,每周两三篇吧! 简单记录自己的学习经历,算是对自己的一点小小的督促! Java8的新特性很多,比如流处理在工作中看到很多的地方都在用,是时候扔掉 ...

  3. 安全组与网络ACL

    通过配置网络ACL和安全组策略,保障VPC内的弹性云服务器安全使用. 安全组对弹性云服务器进行防护:设置不同安全组访问规则实现系统访问控制 网络ACL对子网进行防护:可实现网络区域访问控制

  4. python基础语法6 名称空间与作用域

    目录: 1.函数对象 2.函数嵌套 3.名称空间 4.作用域 函数是第一类对象 1.函数名是可以被引用: def index(): print('from index') a = index a() ...

  5. 跟UI自动化测试有关的技术

    大家都知道,针对UI的自动化技术一般要支持下列的东西: 1. 识别窗口   能够识别尽量多的窗口种类,支持尽量多的UI技术.比如Win32.WinForm.WPF以及WebPage(这个比较特殊,确切 ...

  6. hdu1010-Tempter of the Bone-(dfs+奇偶剪枝)

    http://acm.hdu.edu.cn/showproblem.php?pid=1010 翻译:有只狗被困了,S是起点,D是门,W是墙不能走,‘ . ’是可以走的路,走一次就会在1秒内坍塌,也就是 ...

  7. 项目(二) esp32-cam 网页图像人脸

    https://randomnerdtutorials.com/esp32-cam-video-streaming-face-recognition-arduino-ide/ ESP32-CAM Pi ...

  8. Docker for Window 数据库路径注意事项

    Windows和Linux的文件路径格式不同,以第一行为例的话要改为//D/work/fronent-api:/www //D:标识D盘,如果是其他盘,如F盘://F/

  9. 格式化输出(%用法和fomat用法)

    一:%用法 1.整数输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 2.浮点数输出 %f ——保留小数点后面六位有效数字 %.3f,保留3位小数位%e ——保留 ...

  10. java自动化配置工具 - autoconfig 简介

    对于java程序员来说各种各样的配置文件是司空见惯的,比如spring的bean配置,struts的action配置等等.有些配置会随着运行环境的变化而各不相同,最典型的就是jdbc驱动的配置,在开发 ...