转载翻译自 https://howtodoinjava.com/mockito/mockito-annotations/

这篇 mockito 的教程文章能够帮助你了解更多 mockito 注解,比如 @Mock, @Spy, @Captor, @InjectMocks,来写出更好的单元测试。

1. Mockito 注解

1.1. @Mock

@Mock 注解被往往用来创建以及注入模拟实例。我们会用 mockito 框架创建一个模拟的实例类,而不是去真的创建需要的对象。

@Mock 注解也可以用 var somethingYouWantMock = Mockito.mock(classToMock) 这种函数方式赋值来替代,它们的效果是一样的,而用 @Mock 注解通常能能看起来代码 “整洁” 一点,因为我们不会想用一堆看起来一样的 Mockito.mock 函数在代码里重复得到处都是。

@Mock 注解的优势:

  • 能够快速创建测试所需的对象
  • 重复的模拟创建代码很少
  • 测试类可读性更好
  • 更容易看懂验证报错,因为注解的模拟类直接是类的属性,可以用字段名去赋予含义。

在下面给出的示例中,我们模拟了HashMap类。在实际测试中,我们将模拟实际的应用类。我们在map中放入一个键值对,然后验证,确认方法调用是在模拟的map实例上执行的。

@Mock
HashMap<String, Integer> mockHashMap;@Test
public void saveTest()
{mockHashMap.put("A", 1);Mockito.verify(mockHashMap, times(1)).put("A", 1);Mockito.verify(mockHashMap, times(0)).get("A");assertEquals(0, mockHashMap.size());
}

译者补充:mock意思就是造一个假的模拟对象,不会去调用这个真正对象的方法,这个mock对象里的所有行为都是未定义的,属性也不会有值,需要你自己去定义它的行为。比如说,你可以mock一个假的size(), 使其返回100,但实际上并没有真的创建一个 size 为100的 Map)

...when(mockHashMap.size()).thenReturn(100);assertEquals(100, mockHashMap.size());
...

1.2. @Spy

@Spy注释用于创建一个真实对象并监视这个真实对象。@Spy对象能够调用所监视对象的所有正常方法,同时仍然跟踪每一次交互,就像我们使用mock一样,可以自己定义行为。

可以看到,在下面给的示例中,由于我们向它添加了一个 key-value 键值对,size 变成了 1。我们也能够得到真正的通过键 key 去拿到 value 值的结果。这在 Mock 注解的例子中是不可能的。

译者补充: 因为mock是模拟整个生成一个假对象,spy像是间谍潜伏在真实对象里去篡改行为。

@Spy
HashMap<String, Integer> hashMap;@Test
public void saveTest()
{hashMap.put("A", 10);Mockito.verify(hashMap, times(1)).put("A", 10);Mockito.verify(hashMap, times(0)).get("A");assertEquals(1, hashMap.size());assertEquals(new Integer(10), (Integer) hashMap.get("A"));
}

@Mock和@Spy的区别

在使用@Mock时,mockito创建了类的一个基础套壳实例,完全用于跟踪与它的全部交互行为。这不是一个真正的对象,并且不维护状态,不存在更改。

当使用@Spy时,mockito创建一个类的真实实例,可以跟踪与它的每个交互行为,这个真实类能维护类状态的变化。

1.3 @Captor

@Captor注释用于创建ArgumentCaptor实例,该实例用于捕获方法参数值,来用于进一步做断言验证。

注意mockito使用参数类的equals()方法验证参数值是否相同。

@Mock
HashMap<String, Integer> hashMap;@Captor
ArgumentCaptor<String> keyCaptor;@Captor
ArgumentCaptor<Integer> valueCaptor;@Test
public void saveTest()
{hashMap.put("A", 10);Mockito.verify(hashMap).put(keyCaptor.capture(), valueCaptor.capture());assertEquals("A", keyCaptor.getValue());assertEquals(new Integer(10), valueCaptor.getValue());
}

1.4 @InjectMocks

在mockito中,我们需要创建被测试的类对象,然后插入它的依赖项(mock)来完全测试行为。因此,我们要用到 @InjectMocks 注释。

@InjectMocks 标记了一个应该执行注入的字段。Mockito会按照下面优先级通过构造函数注入setter注入属性注入,来尝试注入你标识的mock。如果上面三种任何给定的注入策略注入失败了,Mockito不会报错。

更多信息: Mock和@ initmock注释的区别

译者补充: @InjectMocks 一般是你要测的类,他会把要测类的mock属性自动注入进去。@Mock 则是你要造假模拟的类。

单元测试框架 Mockito 注解 – @Mock, @Spy, @Captor, @InjectMocks相关推荐

  1. @Mock, @Spy, @Captor and @InjectMocks

    http://www.baeldung.com/mockito-annotations 1. Overview In this tutorial, we'll cover all the annota ...

  2. Mockito cannot mock/spy because : - final class 问题

    Mockito cannot mock/spy because : - final class 问题 现象: 出现报错,且报错信息如下 Mockito cannot mock/spy because ...

  3. Mock和Java单元测试中的Mock框架Mockito介绍

    什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.程序员通常创造模拟对象(mock object)来测试其他对象 ...

  4. 单元测试Mock框架--Mockito

    文章目录 目前开发中,单元测试遇到的问题 解决方案--Mock Junit4 + Mockito: Mockito常用注解: Mockito常用方法: Tips: 总结 目前开发中,单元测试遇到的问题 ...

  5. Java注解@Mock和@InjectMocks及@Mock和@Spy之间的区别

    Java注解@Mock和@InjectMocks及@Mock和@Spy之间的区别 1.@Mock和@InjectMocks的区别 @Mock为您需要的类创建一个模拟实现. @InjectMocks创建 ...

  6. Java单元测试框架与实践(Junit5 + Mockito)

    Java单元测试框架与实践 本文首先在理论上归纳了单元测试在宏观和微观层面要遵循的基本原则,以及测试覆盖率的要求和评价维度.然后具体阐述了笔者实战中总结的基于Junit + Mockito 的单元测试 ...

  7. mockito mock void方法_用过举手!SpringBoot 单元测试利器Mockito

    Mockito 是一种 Java mock 框架,他主要是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean.模拟方法的返回值.模拟抛出异常...等,在了解 Mockito 的具 ...

  8. linux打桩数框架,Mockito 单元测试打桩神器

    last modified by coder4 , 2019/08/30 18:34:26 Mockito 单元测试打桩神器 单元测试 软件测试是软件质量保证的关健环节,代表了需求.设计和编码的最终检 ...

  9. 单元测试系列之五:Mock工具之Mockito实战

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...

最新文章

  1. Mail Archiving Expert电子邮件归档专家
  2. 重启服务器之home下文件全没,小白宝典——树莓派实用工具分享(大神绕路)
  3. js中的Object.create(null) 和 {} 的区别
  4. 中国石油大学计算机专业调剂信息,2014年中国石油大学(北京)计算机专业考研调剂信息(新)...
  5. android安全补丁卸载,这种安全更新能不卸载就不卸载
  6. 4.1 编程语言的几个发展阶段
  7. Linux 命令(18)—— screen 命令
  8. 数据中心基础设施运维有哪些项目?哪些系统?如何实施?
  9. nmap 扫描常见端口——命令
  10. UINO优锘:数字孪生助力运维工程场景化可视化管理
  11. js调起打开APP_浏览器点击打开微信
  12. ECharts仪表盘(详细示例——附有具体注释)
  13. 游戏时弹出内存不能为read的提示框
  14. 数据挖掘——航空公司客户价值分析(分析+建模)
  15. 高德地图android 缓存,高德地图定位不刷新,感觉有缓存
  16. github本地项目上传到远程仓库
  17. Dell服务器出错代码和含义
  18. 三调地类图斑统计分析——GP后端实现
  19. 《关爱码农成长计划》第一期报告
  20. 99年人民币冠号大全

热门文章

  1. 基于Sikuli GUI图像识别框架的PC客户端自动化测试实践
  2. restricted area是什么意思?
  3. windows10 使用 postgreSQL
  4. mysqli 预处理
  5. 安防知识整理_视频监控_《玩转IP看监控》1
  6. 微信jsapi支付获取code_微信支付 第一篇 JSAPI 支付配置与获取 OpenID
  7. zend optimizer linux,Linux环境下安装zend optimizer
  8. 树莓派4b主板特点_树莓派4B的实用配件清单推荐
  9. 如何用VI创建.txt格式的文件?
  10. SecureCRT之激活教程