Mockito 详解:第三部分:结果验证

零:准备代码

public class Foo {private Bar bar;private Tou tou;public int sum(int a, int b) {return bar.add(a, b);}public int count() {bar.badCode();return 5;}
}
public class Bar {public int add(int a, int b) {return a + b;}public void badCode() {throw new RuntimeException("bad bar code");}
}
public class Tou {public void tou() {throw new RuntimeException("tou");}
}

一:方法是否被调用/方法的调用的次数

  • atLeast(int minNumberOfInvocations)允许至少 x 次调用的验证。
  • atLeastOnce()允许至少一次调用的验证。
  • atMost(int maxNumberOfInvocations)允许最多 x 次调用的验证。
  • atMostOnce()允许最多一次调用的验证。
  • never() times(0)的别名,见times(int) 。
  • only()允许检查给定的方法是否只调用一次。
  • times(int wantedNumberOfInvocations)允许验证调用的确切次数。
  • verify(T mock)验证某些行为发生过一次
  • verify(T mock, VerificationMode mode)验证某些行为至少发生过一次/确切的次数/从未发生过。
  • verifyNoInteractions(Object... mocks)验证给定的mock对象上没有发生交互。
  • verifyNoMoreInteractions(Object... mocks)检查任何给定的mock对象上是否有任何未经验证的交互。
  • validateMockitoUsage()验证测试代码中是否有书写错误的地方。

示例:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {//foo 对象内部的成员变量会自动被 @Mock 注解的生成的对象注入。@InjectMocksprivate Foo foo;//bar 对象会自动的注入到 @InjectMocks 注解的对象的成员变量中去。@Mock(lenient = true)private Bar bar;//tou 对象会自动的注入到 @InjectMocks 注解的对象的成员变量中去。@Mock(lenient = true)private Tou tou;@Testpublic void doReturnTest() {Mockito.doReturn(7).when(bar).add(1, 2);foo.sum(1, 2);//1:验证 bar.add(1,2) 方法被调用了一次。Mockito.verify(bar).add(1, 2);//2:等同于1。Mockito.verify(bar, Mockito.times(1)).add(1, 2);//3:验证 bar.add(1,2) 方法至少被调用了n次。Mockito.verify(bar, Mockito.atLeast(1)).add(1, 2);//4:验证 bar.add(1,2) 方法至少被调用了一次。Mockito.verify(bar, Mockito.atLeastOnce()).add(1, 2);//5:验证 bar.add(1,2) 方法至多被调用了n次。Mockito.verify(bar, Mockito.atMost(1)).add(1, 2);//6:验证 bar.add(1,2) 方法至多被调用了一次。Mockito.verify(bar, Mockito.atMostOnce()).add(1, 2);//7:验证 bar.badCode() 方法从没有被调用过。Mockito.verify(bar, Mockito.never()).badCode();//8:验证 bar.add(1,2) 方法只被调用了一次。Mockito.verify(bar, Mockito.only()).add(1, 2);//9:验证给定的mock对象上没有发生交互。Mockito.verifyNoInteractions(tou);//10:检查任何给定的mock对象上是否有任何未经验证的交互。(测试执行过程中和bar对象的交互都验证过了,此时验证通过)Mockito.verifyNoMoreInteractions(bar);//11:验证测试代码中是否有书写错误的地方。Mockito.validateMockitoUsage();}}

二:方法执行时间的验证

  • after(long millis)在给定的毫秒数后将触发验证,允许测试异步代码。
  • timeout(long millis)验证将一遍又一遍地触发,直到给定的毫秒数,允许测试异步代码。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {//foo 对象内部的成员变量会自动被 @Mock 注解的生成的对象注入。@InjectMocksprivate Foo foo;//bar 对象会自动的注入到 @InjectMocks 注解的对象的成员变量中去。@Mock(lenient = true)private Bar bar;//tou 对象会自动的注入到 @InjectMocks 注解的对象的成员变量中去。@Mock(lenient = true)private Tou tou;@Testpublic void doReturnTest() {Mockito.doReturn(7).when(bar).add(1, 2);foo.sum(1, 2);//1:验证 bar.add(1,2) 方法在100ms内执行完成。在给定的毫秒数后将触发验证,允许测试异步代码。Mockito.verify(bar, Mockito.after(100)).add(1, 2);//2:验证 bar.add(1,2) 方法在100ms内执行完成。验证将一遍又一遍地触发,直到给定的毫秒数,允许测试异步代码。Mockito.verify(bar, Mockito.timeout(100)).add(1, 2);}}

更多关于timeout()方法的介绍

验证将一遍又一遍地触发,直到给定的毫秒数,允许测试异步代码。当与mock对象的交互尚未发生时很有用。timeout()方法的广泛使用可能是一种代码异味——有更好的方法来测试并发代码。

timeout()after之间的差异在 after(long) 的 Javadoc.

   //当 somemethod()的执行时间不大于100毫秒时通过//满足验证时立即退出(例如,可能不会等待100毫秒)verify(mock, timeout(100)).someMethod();//上面代码也可以写成这样:verify(mock, timeout(100).times(1)).someMethod();//只要 someMethod() 在两次调用内时间小于100 ms则通过verify(mock, timeout(100).times(2)).someMethod();//等效于上方的代码:verify(mock, timeout(100).atLeast(2)).someMethod();

更多关于after(long)方法的介绍

在给定的毫秒数后将触发验证,允许测试异步代码。当与mock对象的交互尚未发生时很有用。after()方法的广泛使用可能是一种代码异味——有更好的方法来测试并发代码。

尚未实现与 InOrder 验证一起使用。timeout()和之间的差异after()解释如下。

   //100毫秒后,somemethod()执行完毕则验证通过verify(mock, after(100)).someMethod();//上面代码也可以写成这样:verify(mock, after(100).times(1)).someMethod();//100毫秒后,somemethod()执行2次完毕则验证通过verify(mock, after(100).times(2)).someMethod();//100毫秒后,如果 someMethod() 没有执行则验证通过verify(mock, after(100).never()).someMethod();//使用给定的验证模式验证在100ms内someMethod()方法的执行,//在使用你自定义的验证模式时是有用的。verify(mock, new After(100, yourOwnVerificationMode)).someMethod();

timeout() 与 after()

  • timeout() 验证通过后立即退出并成功
  • after() 等待完整的时间来检查验证是否通过

例子:

   //1.mock.foo();verify(mock, after(1000)).foo();//等待 1000 ms之后验证会成功//2.mock.foo();verify(mock, timeout(1000)).foo();//立即成功

三:方法调用顺序验证

  • inOrder(Object... mocks)创建InOrder对象,以允许按顺序验证mock的对象。
  • calls(int wantedNumberOfInvocations)允许按顺序进行非贪婪调用的验证。

关于inOrder

创建InOrder对象以允许按顺序验证模拟的对象。

   InOrder inOrder = inOrder(firstMock, secondMock);inOrder.verify(firstMock).add("was called first");inOrder.verify(secondMock).add("was called second");

按顺序验证是灵活的 -您不必一一验证所有交互,而只需按顺序验证您感兴趣的那些交互

此外,您可以创建 InOrder 对象,仅传递与有序验证相关的mock对象。

InOrder验证是“贪婪的”,但您几乎不会注意到它。

如果您想了解更多信息可以加我qq3177181324

从 Mockito 1.8.4 开始,您可以以顺序敏感的方式使用verifyNoMoreInteractions()。

关于calls()

允许按顺序进行非贪婪验证。例如

   inOrder.verify( mock, calls( 2 )).someMethod( "some arg" );
  • 如果该方法被调用 3 次,则不会失败,与 times(2) 不同
  • 与 atLeast(2) 不同,不会将第三次调用标记为已验证

这种验证方式只能用于顺序验证。

四:验证方法参考

修饰符和类型 方法和说明
static VerificationAfterDelay after(long millis)在给定的毫秒数后将触发验证,允许测试异步代码。
static VerificationMode atLeast(int minNumberOfInvocations)允许至少 x 调用的验证。
static VerificationMode atLeastOnce()允许至少一次调用的验证。
static VerificationMode atMost(int maxNumberOfInvocations)允许最多 x 次调用的验证。
static VerificationMode atMostOnce()允许最多一次调用的验证。
static VerificationMode calls(int wantedNumberOfInvocations)允许按顺序进行非贪婪调用的验证。
static Object[] ignoreStubs(Object... mocks)为了验证,忽略给定mock的存根方法。
static InOrder inOrder(Object... mocks)创建InOrder对象,允许按顺序验证mock的对象。
static LenientStubber lenient()宽松存根,绕过“严格存根”验证(请参阅参考资料Strictness.STRICT_STUBS)。
static VerificationMode never() times(0)的别名,见times(int)
static VerificationMode only()允许检查给定的方法是否只调用一次。
static void reset(T... mocks)聪明 Mockito 用户几乎不使用此功能,因为他们知道这可能是测试不佳的迹象。
static VerificationWithTimeout timeout(long millis)验证将一遍又一遍地触发,直到给定的毫秒数,允许测试异步代码。
static VerificationMode times(int wantedNumberOfInvocations)允许验证调用的确切次数。
static void validateMockitoUsage()首先,如果有任何问题,我鼓励您阅读 Mockito FAQ: github.com/mockito/moc…
static T verify(T mock)验证某些行为发生过一次
static T verify(T mock, VerificationMode mode)验证某些行为至少发生过一次/确切的次数/从未发生过。
static void verifyNoInteractions(Object... mocks)验证给定的模拟上没有发生交互。
static void verifyNoMoreInteractions(Object... mocks)检查任何给定的模拟是否有任何未经验证的交互。

最后小编在学习过程中整理了一些学习资料,可以分享给做软件测试工程师的朋友们,相互交流学习,需要的可以加入我的学习交流群 323432957 或加微dingyu-002即可免费获取Python自动化测开及Java自动化测开学习资料(里面有功能测试、性能测试、python自动化、java自动化、测试开发、接口测试、APP测试等多个知识点的架构资料)

Java测试框架系列:Mockito 详解:第三部分:结果验证相关推荐

  1. 大型企业网络配置系列课程详解(三)--OSPF高级配置与相关概念的理解

    大型企业网络配置系列课程详解(三)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&qu ...

  2. linux设置共享权限设置命令,Linux系列知识详解(三)--------- Linux链接命令和权限管理命令...

    Linux系列知识详解(三)--------- Linux链接命令和权限管理命令 一:链接命令ln 简介:什么是链接命令?链接命令分为软链接和硬链接.其中软链接产生的新文件是以路径的形式表示原文件,类 ...

  3. Java集合框架源码详解系列(一)

     写在前面:大家好!我是晴空๓.如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教.我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/.非常 ...

  4. UnitTest测试框架全栈详解

    金字塔模型 从软件架构的⻆度来说,测试最重要的步骤是在软件开发的时候界入比较好,所以在早期测试的界入,从软件经济学的⻆度上来说,发现的问题解决成本低,投入的资源比较少.因此,对一个测试的系统,开始最佳 ...

  5. Spring MVC学习总结(14)——SpringMVC测试框架之mockMVC详解

    SpringMVC测试框架 基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试. 一 MockMvcBui ...

  6. Python测试框架之pytest详解

    目录 前言 1.pytest安装 2.Pytest的setup和teardown函数 3.Pytest配置文件 4 Pytest常用插件 4.1 前置条件: 4.2 Pytest测试报告 5.pyte ...

  7. java spring框架 注解_详解Java的Spring框架中的注解的用法

    1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的类的实现: class UserManagerImpl implements UserManager { private ...

  8. java 字节输出流_Java IO详解(三)------字节输入输出流

    那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream) 1.字 ...

  9. java reflections_Java反射框架Reflections示例详解

    MAVEN 坐标 org.reflections reflections 0.9.10 Reflections 的作用 Reflections通过扫描classpath,索引元数据,并且允许在运行时查 ...

  10. Java并发编程最佳实例详解系列

    Java并发编程最佳实例详解系列: Java并发编程(一)线程定义.状态和属性 Java并发编程(一)线程定义.状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中, ...

最新文章

  1. 腾讯!阿里!大二男生斩获4家头部科技公司实习offer!凭啥?
  2. shell脚本常用的4种流程控制语句
  3. jackson (json、xml的序列化与反序列化)
  4. 静态路由_在Android中模拟静态方法:让我们总结一下
  5. ado filter 多条记录_江苏气动断料锯商家,多条锯_邢台富宇来机械厂
  6. Android中怎样使用Navicat可视化查看sqllite的数据库(查看db文件)
  7. 寻找免费的阿里云云盾隐秘购买入口,申请并下载ssl证书(https证书)的详细步骤
  8. .NET Core 以及与 .NET Framework的关系
  9. directly test Gateway frontend service in AG3 SICF
  10. Python基础入门_3条件语句和迭代循环
  11. Spring : Spring @Transactional事物创建
  12. Git学习总结(21)——Git 提交规范总结
  13. mysql 5.720安装_MySQL 5.7.27下载安装配置的详细教程
  14. oracle 多表视图更新
  15. 「管理数学基础」2.4 泛函分析:有界线性算子与泛函、例题
  16. 数据挖掘-二手车价格预测 Task02:数据分析
  17. 12星座哪些人会重友轻爱?
  18. logo是啥_logo是什么意思 LOGO知识解读
  19. 计算机ms高级应用科目一 科目二考什么,科目一、科目二、科目三、科目四都考什么?全都在这儿了!...
  20. Cepton宣布与美国底特律顶级汽车制造商合作,赢得业内最大ADAS激光雷达量产订单

热门文章

  1. 同一服务器的跨库查询
  2. 如何快速新建多个不同名称文件夹?
  3. GMA Round 1 大吉大利,晚上吃鸡
  4. 解决卸载wifi共享软件后无法连网的问题
  5. 一维条形码 code128 的全面介绍
  6. Leetcode 500:键盘行
  7. Photoshop CC 2017工具的使用
  8. Photoshop CC 2017安装
  9. 基于模型的软件开发方法综述
  10. 【自动驾驶】华为车BU介绍(2021-11-23晚直播记录)