原文链接:https://mp.weixin.qq.com/s/rQRO2SaqhQImQlnA5NsEQw
原作者:JAVA极客技术
Hello 大家好,我是阿粉,日常工作中很多时候我们都需要同事间的相互配合协作完成某些功能,所以我们经常会遇到服务或者应用内不同模块之间要互相依赖的场景 。比如下面的场景,serviceA 中的 methodA() 方式依赖 serviceB 中的 methodB() 方法返回操作的结果 。那如果我们要对自己的methodA() 方法进行编写单元测试,还需要等其他同事的methodB() 方法开发完成才行 。那有没有什么办法我们可以跳过或者说模拟方法 B 的输出呢?这就引出了我们今天的主角 Mockito,一个优秀的 Mock 测试框架 。

文章插图
我们通过使用 Mock 技术可以让开发不停滞,Mock技术的作用是将服务与服务之间的依赖在测试自测阶段隔离开,让开发人员在自己的应用内部通过模拟的方式把需要依赖外部的接口给构造出来,从而保证不被外界的开发进度所影响 。今天我们要谈到的Mockito 就是一个优秀的 Mock 框架 。
Mockito
Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn’t give you hangover because the tests are very readable and they produce clean verification errors.Mockito 是一个很好用的模拟框架 。它让您可以使用干净简单的 API 编写漂亮的测试 。Mockito 的可读性非常好,不会让你感到迷惑,产生的验证错误也很明确 。
官网地址:https://site.mockito.org/
中文文档:https://github.com/hehonghui/mockito-doc-zh#0
测试用例 1首先在工程的 pom 文件里面加依赖,我们加上 mockito 和junit 的依赖 。
<dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.9.5</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency>接下来我们编写一个简单的测试用例,这里我们通过mock 一个 List 对象,先添加几个元素,后面验证添加交互是否与我们预期的一致 。@Testpublic void testVerify() throws Exception {//创建 mock 对象List mockedList = mock(List.class);mockedList.add("test1");mockedList.add("test2");mockedList.add("test2");mockedList.clear();//验证是否执行了一次 add("test1") 操作verify(mockedList).add("test1");//同上面验证是否执行了一次 add("test1") 操作,默认就是 time(1)verify(mockedList, times(1)).add("test1");//验证是否执行了3次 add("test2") 操作//verify(mockedList, times(3)).add("test2");verify(mockedList).clear();}上面的测试用例我们运行过后是如下效果,测试用例是通过的 。
文章插图
当我们放开verify(mockedList, times(3)).add("test2"); 这一行代码进行运行时,我们可以看到测试用例未通过,提示的错误是我们预期执行 3 次,结果实际只执行了 2 次add("test2") 操作 。

文章插图
上面的测试用例是验证对应方式的执行次数是否和预期一致,除了有准确的次数之外,还有最多,至少,从未等验证方式,如下所示:
//精确次数 verify(mockedList, times(3)).add("test2"); //至少 1次 verify(mockedList, atLeastOnce()).add("test2"); //至少 2 次 verify(mockedList, atLeast(2)).add("test2"); //最多 5 次 verify(mockedList, atMost(5)).add("test2");测试用例 2通过设值或者打桩的方式预设参数,如下所示,当执行 get(0) 操作时,我们通过 thenReturn()方法返回 hello,当执行 get(1)操作时我们抛出空指针异常,运行结果如下图所示:@Testpublic void testWhen() throws Exception {LinkedList mockedList = mock(LinkedList.class);//设置值,通常被称为打桩when(mockedList.get(0)).thenReturn("hello");when(mockedList.get(1)).thenThrow(new NullPointerException());System.out.println(mockedList.get(0));//这里会打印 "null" 因为 get(2) 没有设置System.out.println(mockedList.get(2));//这里会抛 exceptionSystem.out.println(mockedList.get(1));//验证有没有执行 get(0) 操作verify(mockedList).get(0);}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 秘制蛋黄饼的做法
- 猕猴桃不能与什么同吃呢?
- 推荐一个生产环境问题排查利器
- 10大优秀Python开发工具
- 张飞是一个怎样的人物,评价张飞是什么样的人
- 中国第一个大一统王朝是哪个朝代,历代统一中国的有几个朝代
- 秦始皇不是第一个皇帝,为什么秦始皇是中国第一皇帝
- 程序员的核心竞争力
- 文鸳厉害嘛,文鸳和文鸯是一个人吗?
- 贾岛是一个什么样的人,贾岛的生平
