相同点

spy和mock生成的对象不受spring管理

不同点

1.默认行为不同

对于未指定mock的方法,spy默认会调用真实的方法,有返回值的返回真实的返回值,而mock默认不执行,有返回值的,默认返回null

2.使用方式不同

Spy中用when...thenReturn私有方法总是被执行,预期是私有方法不应该执行,因为很有可能私有方法就会依赖真实的环境。
Spy中用doReturn..when才会不执行真实的方法。

mock中用 when...thenReturn 私有方法不会执行

3.代码统计覆盖率不同
@spy使用的真实的对象实例,调用的都是真实的方法,所以通过这种方式进行测试,在进行sonar覆盖率统计时统计出来是有覆盖率;
@mock出来的对象可能已经发生了变化,调用的方法都不是真实的,在进行sonar覆盖率统计时统计出来的Calculator类覆盖率为0.00%。

以下为测试代码部分


 

  1. Calculator.java
  1. class Calculator {
  2. private int sumXX(int a, int b) {
  3. System.out.println("sumXX");
  4. return a + b;
  5. }
  6.  
  7. public int callSumXX(int a, int b) {
  8. System.out.println("callSumXX");
  9. return sumXX(a, b);
  10. }
  11. }
  1. SpyAndMockTest.java
  1. import org.junit.Test;
  2. import org.junit.runner.RunWith;
  3. import org.powermock.api.mockito.PowerMockito;
  4. import org.powermock.core.classloader.annotations.PrepareForTest;
  5. import org.powermock.modules.junit4.PowerMockRunner;
  6.  
  7. import static org.junit.Assert.assertEquals;
  8. import static org.mockito.ArgumentMatchers.anyInt;
  9.  
  10. @RunWith(PowerMockRunner.class)
  11. @PrepareForTest({Calculator.class})
  12. public class SpyAndMockTest {
  13.  
  14. @Test
  15. public void testSumXXBySpy_Call_Private_Method() throws Exception {
  16. Calculator cal= PowerMockito.spy(new Calculator());
  17. PowerMockito.when(cal,"sumXX",anyInt(),anyInt()).thenReturn(2);
  18. assertEquals(2, cal.callSumXX(1, 2));
  19. }
  20.  
  21. @Test
  22. public void testSumXXBySpy_Not_Call_Private_Method() throws Exception {
  23. Calculator cal= PowerMockito.spy(new Calculator());
  24. PowerMockito.doReturn(2).when(cal,"sumXX",anyInt(),anyInt());
  25. assertEquals(2, cal.callSumXX(1, 2));
  26. }
  27.  
  28. @Test
  29. public void testSumXXByMock_Not_Call_Real_Method() throws Exception {
  30. Calculator cal= PowerMockito.mock(Calculator.class);
  31. PowerMockito.when(cal,"sumXX",anyInt(),anyInt()).thenReturn(2);
  32. assertEquals(0, cal.callSumXX(1, 2));
  33. }
  34. @Test
  35. public void testSumXXByMock_Call_Real_Method() throws Exception {
  36. Calculator cal= PowerMockito.mock(Calculator.class);
  37. PowerMockito.when(cal,"sumXX",anyInt(),anyInt()).thenReturn(2);
  38. PowerMockito.when(cal.callSumXX(anyInt(),anyInt())).thenCallRealMethod();//指明callSumXX调用真实的方法
  39. assertEquals(2, cal.callSumXX(1, 2));
  40. }
  41. }

附上 pom.xm文件依赖

  1. <dependency>
  2. <groupId>org.powermock</groupId>
  3. <artifactId>powermock-api-mockito2</artifactId>
  4. <version>2.0.0-beta.5</version>
  5. <scope>test</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.powermock</groupId>
  9. <artifactId>powermock-core</artifactId>
  10. <version>2.0.0-beta.5</version>
  11. <scope>test</scope>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.powermock</groupId>
  15. <artifactId>powermock-module-junit4</artifactId>
  16. <version>2.0.0-beta.5</version>
  17. <scope>test</scope>
  18. </dependency>

  

Mockito中的@Mock和@Spy如何使用的更多相关文章

  1. 单元测试Mockito中的Mock和Spy

    转载:https://blog.csdn.net/qq_30141957/article/details/81273829 项目中,有些函数需要处理某个服务的返回结果,而在对函数单元测试的时候,又不能 ...

  2. mockito中两种部分mock的实现,spy、callRealMethod

    什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现). 为什么需要部分mock? A:当需要测试一个 ...

  3. Mockito中@Mock与@InjectMock

    Mockito是java单元测试中,最常用的mck工具之一,提供了诸多打桩方法和注解.其中有两个比较常用的注解,@Mock和@InjectMock,名字和在代码中使用 的位置都很像,对于初学者,很容易 ...

  4. Mockito 中文文档 ( 2.0.26 beta )

    Mockito 中文文档 ( 2.0.26 beta ) 由于缺乏校对,难免有谬误之处,如果发现任何语句不通顺.翻译错误,都可以在github中的项目提出issue.谢谢~ Mockito框架官方地址 ...

  5. 单元测试:单元测试中的mock

    公司要求提升单元测试的质量,提高代码的分支覆盖率和行覆盖率,安排我研究单元测试,指定方案分享并在开发部普及开.整理完资料后,同步一下到博客. 单元测试中的mock的目的 mock的主要目的是让单元测试 ...

  6. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  7. 【转】利用Python中的mock库对Python代码进行模拟测试

    出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...

  8. Electron-vue实战(三)— 如何在Vuex中管理Mock数据

    Electron-vue实战(三)— 如何在Vuex中管理Mock数据 作者:狐狸家的鱼 本文链接:Vuex管理Mock数据 GitHub:sueRimn 在vuex中管理mock数据 关于vuex的 ...

  9. 比POSTMAN更好用!在国产接口调试工具APIPOST中使用Mock

    APIPOST可以让你在没有后端程序的情况下能真实地返回接口数据,你可以用APIPOST实现项目初期纯前端的效果演示,也可以用APIPOST实现开发中的数据模拟从而实现前后端分离.在使用APIPOST ...

随机推荐

  1. 【转载】Python tips: 什么是*args和**kwargs?

    转自Python tips: 什么是*args和**kwargs? 先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwa ...

  2. 第10组Alpha冲刺(3/4)

    队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 继续学习Android studio和Java 制作登录注册界面前端 展示GitHub当日代码/文档签入 ...

  3. 京东商城跨域设置Cookie实现SSO单点登陆过程

    可以先看下这边文章:http://blog.chinaunix.net/uid-25508399-id-3431705.html   1.点击首页的登陆按钮跳转到京东的登陆中心https://pass ...

  4. linux简单命令9--yum安装软件

    +

  5. idea 双击选中一个变量,及高亮显示相同的变量

    其实idea有这个功能,只是没有背景颜色,在这里有可能是编辑区的背景颜色和选中变量的背景颜色一样, 所有我们只需要调一下背景颜色就可以了 版本:ideaIU-2018.1.5 1. 到这里就结束啦..

  6. Python新利器之pipenv

    前言 之前学习异步asyncio库的时候,因为asyncio库支持Python3.5以上的版本,而我的Ubuntu14.04只有Python3.4,虽然下载了Python3.6,但是想直接利用ipyt ...

  7. partprobe 和 partx 的用法

    partprobe: 用于重读分区表,当出现删除文件后,出现仍然占用空间.可以partprobe在不重启的情况下重读分区. 将磁盘分区表变化信息通知内核,请求操作系统重新加载分区表. -d 不更新内核 ...

  8. 【转】ffluos编译

    FluffOS是在MUDOS基础上更新完成的.进行了许多新功能和bug修复. 针对LPC有很好的兼容性,如果你的MUD运行MUDOS V22+版本,可以很容易运行在fluffos上. 系统环境: Cn ...

  9. CentOS下Hive搭建

    目录 1. 前言 2. MySQL安装 2.1 更换yum下载源 2.2 开启MySQL远程登录 3. Hive安装 3.1 下载Hive 3.2 安装Hive和更改配置文件 4. MySQL驱动包的 ...

  10. curl and wget

    写在前面: a.  对比curl 和 wget 的相同和不同点 来记忆 a-1 curl url  直接将请求内容输出到标准输出. 如果下载不是瞬时间完成,会显示下载进度条,如果向取消,加-s : w ...