Mockito-方法介绍(一)

前言

上一篇的《Mockito-入门》主要是让大家对Mockito有个初步的认识,本篇则是对官方文档对Mockito的介绍进行解释。大家也可以去http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html进行查看。

正题

Mockito的主要用途就是用来模拟对象(Mock)、验证方法被调用次数(Verification)、返回期望值(Stubbing)。

1.Let‘s verify some behaviour!-验证行为

Once created, mock will remember all interactions.——来自官网

即一旦一个mock对象被创建,那么该对象所有交互行为都会被记住。比如下面例子中它可以记住mockedList某个方法是否被调用过或者被调用过几次。

import static org.mockito.Mockito.*;
import java.util.List;
import org.junit.Test;

public class TestMockito {

    @Test
    public void testMockito1(){
    	 // 创建模拟对象
    	 List mockedList = mock(List.class);

    	 //using mock object
    	 mockedList.add("one");
    	 mockedList.clear();

    	 // 验证add方法是否在前面被调用了一次,且参数为“one”。clear方法同样。
        verify(mockedList).add("one");
        verify(mockedList).clear();

	// 下面的验证会失败。因为没有调用过add("two")。
	verify(mockedList).add("two");
    }
}

2.How about some stubbing? -返回期望值

By default, for all methods that return value, mock returns null, an empty collection or appropriate primitive/primitive wrapper value (e.g: 0, false, ... for int/Integer,
boolean/Boolean, ...).——来自官网

对于有返回值但没有设置期望值的模拟对象,Mockito会返回相应的默认值,内置类型int会返回0,boolean返回false,其他则返回null。

这个返回默认值主要是因为Mock对象会覆盖(override)整个被Mock的对象的方法,所以没有设置期望值的就只能返回默认值了。

	@Test
	public void testMockito2() {
		// 我们不仅可以模拟接口还可以模拟具体类。
		LinkedList mockedList = mock(LinkedList.class);

		// stubbing 当get(0)被调用时,返回"first". 方法get(1)被调用时,抛异常
		when(mockedList.get(0)).thenReturn("first");
		when(mockedList.get(1)).thenThrow(new RuntimeException());

		// 下面会输出"first"
		System.out.println(mockedList.get(0));

		// 下面会输出"null",因为999没有被设置期望值
		System.out.println(mockedList.get(999));

		// 下面会抛出异常,因为设置的返回值是异常(想要testMokito2测试通过,将下面这一行get(1)注释即可)
		System.out.println(mockedList.get(1));

		//重复stub两次,则以第二次为准。如下将返回"second":
		when(mockedList.get(0)).thenReturn("first");
		when(mockedList.get(0)).thenReturn("second");
		// 输出"second"
		System.out.println(mockedList.get(0));

		//如果是下面这种形式,则表示第一次调用时返回“first”,第二次调用时返回“second”。可以写n多个。
		when(mockedList.get(0)).thenReturn("first").thenReturn("second");
		// 输出"first"
		System.out.println(mockedList.get(0));
		// 输出"second"
		System.out.println(mockedList.get(0));
		// 输出"second"
		System.out.println(mockedList.get(0));
	}

3.Argument matchers-参数匹配

If you are using argument matchers, all arguments have to be provided by matchers.——来自官网

有关参数匹配很重要的一点:一旦某个方法的参数使用了参数匹配,则该方法所有的参数都得使用参数匹配。

	@Test
	public void testMockito3() {
		LinkedList mockedList = mock(LinkedList.class);

		// 使用內置的參數匹配函數anyInt()
		when(mockedList.get(anyInt())).thenReturn("element");

		// 也可以使用自定義的匹配類,比如下面的isValid就是一個自定義的匹配器
		when(mockedList.contains(argThat(isValid()))).thenReturn(false);

		// 下面會輸出"element"
		System.out.println(mockedList.get(999));

		// 也可以通過參數匹配方法進行驗證
		verify(mockedList).get(anyInt());

		// 下面的方法會報錯,因為第一個參數沒有使用參數匹配,而第二個參數使用了參數匹配
		verify(mockedList).set(1, anyString());
	}

	private Matcher<String> isValid(){
		return Matchers.any();
	}

4.Verifying exact number of invocations / at least x / never-验证调用的具体次数/最少次数/从未调用

times(1) is the default. Therefore using times(1) explicitly can be omitted.——来自官网

默认调用一次,所以对于1次我们可以省略掉times(1).

	@Test
	public void testMockito4() {
		LinkedList mockedList = mock(LinkedList.class);

		// using mock
		mockedList.add("once");

		mockedList.add("twice");
		mockedList.add("twice");

		mockedList.add("three times");
		mockedList.add("three times");
		mockedList.add("three times");

		// 下面兩種寫法都是針對調用1次,因為1是默認的,我們一般使用第一種寫法就可以
		verify(mockedList).add("once");
		verify(mockedList, times(1)).add("once");

		// 指定了具體調用的次數
		verify(mockedList, times(2)).add("twice");
		verify(mockedList, times(3)).add("three times");

		// 使用了never(),即times(0)
		verify(mockedList, never()).add("never happened");

		// 使用了最多多少次,最少多少次
		verify(mockedList, atLeastOnce()).add("three times");
		verify(mockedList, atLeast(2)).add("three times");
		verify(mockedList, atMost(5)).add("three times");
	}

5.Stubbing void methods with exceptions-设置void方法的返回值为抛异常

Mockito起初有一个stubVoid(Object)方法专门针对void方法的调用,但是stubVoid()方法被弃用换成了doThrow(Throwable),为了与doAnswer(Answer)保持一致,对于doThrow与doAnswer会在后面12详细讲解。

6.Verification in order-验证调用顺序

Verification in order is flexible - you don‘t have to verify all interactions one-by-one but only those that you are interested in testing in order.——来自官网

Mockito对于顺序的验证是比较灵活的,你不必一一验证所有的调用,只需要验证你所需要的即可。

	@Test
	public void testMockito6(){
		 List firstMock = mock(List.class);
		 List secondMock = mock(List.class);

		 //using mocks
		 firstMock.add("was called first");
		 secondMock.add("was called second");

		 // 创建InOrder对象时只需要传入你所需要验证顺序的Mock对象即可
		 InOrder inOrder = inOrder(firstMock, secondMock);

		 // 下面这两个是正确的,调用顺序正确
		 inOrder.verify(firstMock).add("was called first");
		 inOrder.verify(secondMock).add("was called second");

		 // 下面这两个会失败,因为调用的顺序出错了
		 inOrder.verify(secondMock).add("was called second");
		 inOrder.verify(firstMock).add("was called first");
	}

小结:

由于篇幅过长,我将方法介绍分为了两部分,一共有十三点,后七点会在下一篇继续介绍。

时间: 2024-08-27 13:56:06

Mockito-方法介绍(一)的相关文章

Json数据的序列化与反序列化的三种常用方法介绍

以下内容是本作者从官网中看相应的教程后所做的demo,其体现了作者对相关知识点的个人理解..作者才疏学浅,难免会有理解不到位的地方..还请各位读者批判性对待... 本文主要介绍在Json数据的序列化与反序列化的过程中我经常用到的三种工具的基本使用方法,及其他们之间 的比较...希望能够对读者们有一些帮助... 这里介绍到的三种解析与生成Json数据的方法分别是:标准JSON解析与生成方法.使用gson解析与生成JSON数据 .使用fastJsson解析与生成JSON数据. 首先,这些工具都可以到

SVG DOM常用属性和方法介绍

将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析器所特有的.SVG支持DOM2标准. 12.2.1  文档初始化相关 evt属性 evt表示事件本身,可以通过evt获取与当前事件相关的信息,用户可以在script中定义响应函数,进行相应的处理.它与普通JavaScript脚本中的event基本相同,只不过在普通JavaScript的脚本中简写成“e”. ownerDocument属性 通过引

Memcached 常见命令 telnet 使用方法介绍

Memcached 常见命令: telnet 使用方法介绍: (1)建立telnet连接,命令"telnet 127.0.0.1 11211".win7下会提示"telnet不是内部或外部命令",解决方法是"控制面板"-->"程序和功能"-->"打开或关闭windows功能"-->勾选"telnet客户端". (2)添加数据--命令"add name 0 60

ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者其他. 1.创建序列 Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE 权限 CREATE SEQUENCE CUX_DEMO_SEQUENCEMINVALUE 1MAXVALUE 99999999999START WITH 1000

jQuery用unbind方法去掉hover事件及其他方法介绍

近日项目开发十分的繁忙,其中一个需求是实现响应式导航.(响应式的问题我们在css相关的博客中再交流) 大家都知道导航是需要下来菜单效果的,必然就会用到 jQuery的 hover() 方法.若是导航放在ipad中,自然hover()就没有什么意义了.那该如何取消hover()并添加touch事件呢? 今天遇到jquery需要去掉hover的问题,原以为直接unbind(“hover”)就可以搞定,可是搞了半天都报错. 原因其实很简单,hover并不是事件.打开参考手册,hover其实由 mous

WPF使用MediaElement方法介绍

搬运自:http://wurang.me/2014/04/29/WPF-MediaElement.html 在WPF或Silverlight中使用MediaElement控件可以方便的制作一个视频音频播放器. 首先制作一个UserControl: 代码如下: <DockPanel Height="387"> <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom"&

Linux 下查看某一个程序所使用的内存方法介绍

Linux 下查看某一个程序所使用的内存方法介绍 在 Linux 上进行开发和运营维护的时候,免不了要查看某一个程序所占用内存的情况.常用方法总结如下(注意第四种方法): 第一种:ps -aux | grep process_name 举例如下:现打算监控/usr/bin/sshd所占的内存,首先需找到pid,然后使用top进行有目标的监控,RES即为内存值,见下两图: top -p 1231,截图如下:    第二种:top -p pid 查看程序的情况 如上图所示! 第三种:cat /pro

HTML DOM对象的属性和方法介绍(原生JS方法)

HTML DOM对象的属性和方法介绍 DOM 是 Document Object Model(文档对象模型)的缩写. DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口),它允许程序和脚本动态地访问和更新文档的内容,结构和样式. W3C DOM 标准被分为 3 个不同的部分: 核心 DOM - 针对任何结构化文档的标准模型 XML DOM - 针对 XML 文档的标准模型 HTML DOM - 针对 HTML 文档的标准模型 HTML DOM 定义了所有 HTML 元

游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

(转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例) 重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rendering Path Details 延迟光照渲染路径的细节 Deferred Lighting Rendering Path Details 以unity3d为例,以下将详细讲解三种灯光渲染方式的实现.原理及缺陷. 顶点照明渲染路径

C#读写txt文件的两种方法介绍 v

C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出. byte[] byData = new byte[100]; char[] charData = new char[1000]; public void Read() { try { FileStream file = new FileStream("E:\\test.txt", Fi