单元测试-Mockito(一)

1.概述

Java常用的单元测试框架有:Junit,TestNg,Easymock,Mockito,PowerMock。

本文主要讨论Mockito框架,是基于学习mockito文档和自己实操验证理解而来,mockito文档中文地址:https://github.com/hehonghui/mockito-doc-zh,感谢并向他们致敬。

开始之前,先谈谈对单元测试的理解,就不照搬普世定义了,只谈谈个人浅薄认识。

所谓单元测试unit test也叫打桩测试,我个人理解就是针对一个类或者说类中的一个方法,编写测试代码,在测试代码中做一些假设性的输入,断言被测试的代码是否能得出自己想要的逻辑结果。

写单元测试的好处,我个人工作经历认为比较明显的是:单元测试都跑过的代码,基本前后台联调没有问题;再者,对代码重构后,如果保持原来的输入输出不变,那么跑一遍单元测试,算是给自己吃颗定心丸。当然单元测试也有缺点,就是增加了工作代码量,需要花费程序员更多的时间,视项目具体情况而使用吧。

2.实操

实操之前记得导入mockito的jar包(import staticorg.mockito.Mockito.*; ),copy 然后alt+enter让maven自动增加就行:


image

或者把以下依赖增加到pom文件中:

<dependency>
   <groupId>org.mockito</groupId>
   <artifactId>mockito-all</artifactId>
   <version>1.9.5</version>
   <scope>test</scope>
 </dependency>

2.1 验证某些行为(方法)

一旦mock对象被创建了,mock对象会记住所有的交互。然后你就可能选择性的验证你感兴趣的交互。如果验证时,和使用中操作的不同,或者增加的对象不是一个,或者增加方法都会验证失败,如图所示:
图片.png

2.2做测试桩 (Stub)

测试桩可以理解为对mock对象进行的一些预期操作,mock函数默认返回的是null。
图片.png

2.2参数匹配器

参数匹配器指anyInt(),anyString()能代替复杂的参数匹配,让测试代码简洁。

 when(mockedList.get(anyInt())).thenReturn("element");
 verify(mock).someMethod(anyInt(), anyString(), eq("third argument"));

2.3验证确切verify(mock,time(x)).operate()、最少atLeast()/最多atMost()、从未调用never()

//mocklist .add 方法指只执行了一次
 verify(mockedList, times(1)).add("once");
 // 验证具体的执行次数ver
 verify(mockedList, times(3)).add("three times");
 // 使用never()进行验证,never相当于times(0)
 verify(mockedList, never()).add("never happened");

 //verification using atLeast()/atMost()
 // 使用atLeast()/atMost()
 verify(mockedList, atLeastOnce()).add("three times");
 verify(mockedList, atLeast(2)).add("five times");
 verify(mockedList, atMost(5)).add("three times");

2.4返回值为void的函数通过Stub抛出异常范式:doThrow(exception).when().operate()

doThrow(new RuntimeException()).when(mockedList).clear();
// 调用这句代码会抛出异常
mockedList.clear();

2.5验证执行顺序InOrder

 List singleMock = mock(List.class);
 singleMock.add("was added first");
 singleMock.add("was added second");
 // 为该mock对象创建一个inOrder对象
 InOrder inOrder = inOrder(singleMock);
 // 确保add函数首先执行的是add("was added first"),然后才是add("was added second")
 inOrder.verify(singleMock).add("was added first");
 inOrder.verify(singleMock).add("was added second");
 // B. Multiple mocks that must be used in a particular order
 // B .验证多个mock对象的函数执行顺序
 List firstMock = mock(List.class);
 List secondMock = mock(List.class);
 //using mocks
 firstMock.add("was called first");
 secondMock.add("was called second");
 //create inOrder object passing any mocks that need to be verified in order
 // 为这两个Mock对象创建inOrder对象
 InOrder inOrder = inOrder(firstMock, secondMock);
 //following will make sure that firstMock was called before secondMock
 // 验证它们的执行顺序
 inOrder.verify(firstMock).add("was called first");
 inOrder.verify(secondMock).add("was called second");

2.6确保交互(interaction)操作不会执行在mock对象上verifyZeroInteractions()

 mockOne.add("one");
 // 普通验证
 verify(mockOne).add("one");
 // 验证某个交互是否从未被执行
 verify(mockOne, never()).add("two");
 // 验证mock对象没有交互过
 verifyZeroInteractions(mockTwo, mockThree);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容