mock与spy的区别

  • 1. mock
    • 1.1 mock对象的方法不执行具体逻辑
    • 1.2 使用方法打桩返回给定数据
    • 1.3 mock如何执行具体逻辑?
  • 2. spy
    • 2.1 spy对象的方法执行具体逻辑
    • 2.2 spy如何不执行具体逻辑?

1. mock

指定需要mock的类型类(接口或者实现类),生成 Mock 类,其中所有的方法都不是真实的方法,而且返回值都是NULL或者Empty。

1.1 mock对象的方法不执行具体逻辑

使用mock对象,访问对象方法不会执行具体逻辑

    @Testpublic void testGetGiftList_mock_normal_gift() {GiftModel mockGiftModel = Mockito.mock(GiftModel.class);List<String> giftList = mockGiftModel.getGiftList(0);System.out.println("mock normalGiftList: " + giftList);}

输出

mock normalGiftList: []

1.2 使用方法打桩返回给定数据

    @Testpublic void testGetGiftList_mock_stub_normal_gift() {List<String> result = new ArrayList<>();result.add("Stub");Mockito.when(mockGiftModel.getGiftList(0)).thenReturn(result);List<String> giftList = mockGiftModel.getGiftList(0);System.out.println("mock normalGiftList: " + giftList);}

输出:

mock normalGiftList: [Stub]

1.3 mock如何执行具体逻辑?

    @Testpublic void testGetGiftList_callRealMethod_mock_normal_gift() {Mockito.doCallRealMethod().when(mockGiftModel).getGiftList(0);List<String> giftList = mockGiftModel.getGiftList(0);System.out.println("doCallRealMethod normalGiftList: " + giftList);}

输出:

doCallRealMethod normalGiftList: [normal]

待测试类

public class GiftModel {public GiftModel() {}public List<String> getGiftList(int level) {if (level == 0) {return getNormalGiftList();} else {return getLuxuryGiftList();}}private List<String> getNormalGiftList() {ArrayList<String> gifts = new ArrayList<>();gifts.add("normal");return gifts;}private List<String> getLuxuryGiftList() {ArrayList<String> gifts = new ArrayList<>();gifts.add("luxury");return gifts;}
}

2. spy

spy机制可以监视一个真实对象,对其进行方法调用会执行真实逻辑;spy也可以打桩指定的方法。

2.1 spy对象的方法执行具体逻辑

    @Testpublic void testGetGiftList_spy_luxury_gift() {GiftModel spyGiftModel = Mockito.spy(GiftModel.class);List<String> giftList = spyGiftModel.getGiftList(1);System.out.println("spy luxuryGiftList: " + giftList);}

输出

spy luxuryGiftList: [luxury]

2.2 spy如何不执行具体逻辑?

spy中使用doReturn…when打桩,不会执行具体逻辑
spy中使用when…thenReturn打桩,会执行具体逻辑

    @Testpublic void testGetGiftSum_spy_first_doReturn() {Mockito.doReturn(1).when(spyGiftModel).getGiftSum();System.out.println("spy getGiftSum: " + spyGiftModel.getGiftSum());}@Testpublic void testGetGiftSum_spy_first_when() {Mockito.when(spyGiftModel.getGiftSum()).thenReturn(2);System.out.println("spy getGiftSum: " + spyGiftModel.getGiftSum());}

运行结果:

spy getGiftSum: 1
call real method
spy getGiftSum: 2

待测方法:

    public int getGiftSum() {System.out.println("call real method");return 100;}

mock与spy的区别相关推荐

  1. Mock和Spy的区别 打桩的区别

    mock与spy @Mock 1.对该对象所有非私有方法的调用都没有调用真实方法 2.对该对象私有方法的调用无法进行模拟,会调用真实方法 @Spy 对该对象所有方法的调用都直接调用真实方法 一句话来说 ...

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

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

  3. @Mock与@InjectMocks的区别

    @Mock: 创建一个Mock. @InjectMocks: 创建一个实例,简单的说是这个Mock可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中. 注意: ...

  4. @Mock,@Spy和@InjectMock

    1.@Mock:mock对象,对函数的调用均使用mock,不会调用真实方法,使用: Mockito.when(testService.getById(Mockito.any())).thenRetur ...

  5. android静态方法如何测试,android – 如何使用mock()和spy()测试静态方法

    通常情况下,如果你最终使用PowerMock,这是一个很好的迹象,表明你最有可能是错误的方式. 如果不是直接引用毕加索,而是创建一个组件,它的职责是加载图像,让我们说类ImageLoader.这会给你 ...

  6. mock和fake的区别

    fake:说话,讲真话; mock: adj. 模拟的; 仿制的; 虚假的; 不诚实的; 今天看到一位大牛的测试框架中提到fake,特查阅了一下. mock对象是指对外面依赖系统的模拟,在运行时刻可以 ...

  7. 单元测试框架 Mockito 注解 – @Mock, @Spy, @Captor, @InjectMocks

    转载翻译自 https://howtodoinjava.com/mockito/mockito-annotations/ 这篇 mockito 的教程文章能够帮助你了解更多 mockito 注解,比如 ...

  8. android mock测试资源,Android测试基础整理篇

    Android test framework 转载请注明来自:http://blog.csdn.net/liaoqianchuan00/article/details/23032357 1.  基本 ...

  9. Spring的Bean如何进行Mock

    上一篇文章讲了Spring的Bean的单元测试如何写,但是如果我们的一个Bean依赖了很多其他的Bean,而其他的Bean也有依赖,而我们只是想测试这个Bean的功能应该怎么办呢? 这里也引发了一个另 ...

最新文章

  1. 重磅直播 | 室内动态变化场景中的相机重定位(CVPR2021)
  2. Android Virtual Device(AVD)屏幕大小调整
  3. python csv性能_性能:Python pandas DataFrame.to_csv附加逐渐变慢
  4. PC-飞起来!我的Windows XP——五步快速优化Windows XP
  5. 【最佳实践】OSS开源工具ossutil-大文件断点续传
  6. android 阻塞式函数,Android之PC浏览器上传表单格式大文件到手机客户端read函数阻塞问题...
  7. java中的DES,AES,BASE64,MD5和Cipher类\MessageDigest类
  8. apache端口一直在增加_PHP环境全套针细教程:Windows安装Apache, PHP and MYSQL
  9. 综合计算机工时,计算机辅助工时定额制定与管理系统的研究与开发
  10. 企业文化之华为和汤森路透
  11. 做一个自己的PC微信无感免打扰检测僵尸粉死粉的小工具。使用c++ call
  12. 最全H桥电机驱动模块L298N原理及应用
  13. ubuntu20.04中安装划词翻译_中英文文档翻译
  14. 【CentOS-7.4】Sphinx 安装与简单配置
  15. 关于印发《深圳市福田区支持战略性新兴产业和未来产业集群发展若干措施》的通知
  16. 腾讯微博Android客户端开发 - OAuth1.0认证介绍
  17. android 触控优化,太滑手了,安卓这款触控优化神器要逆天!
  18. 关于三角形面积的公式与格点多边形面积计算算法的讨论
  19. EMC测试仪器_如何实现EMC的测试工作?
  20. 转:Cookie MappingRTB,SSP,DSP,Ad Exchange

热门文章

  1. 匈牙利算法的MATLAB实现
  2. c语言实现分治法求第K大元素(详细解释)
  3. 三容水箱液位控制系统_三容水箱液位控制系统的PID
  4. 新手教程--手把手教你从零开始制作一款电商必备的商城小程序
  5. Java生成ZIP压缩包
  6. 利用AT89C52定时器输出可调PWM
  7. Python数据可视化 Pyecharts 制作 Parallel 平行坐标系
  8. 【python函数】
  9. 徐小平:不要用兄弟情谊来追求共同利益,要用共同利益追求兄弟情谊
  10. chrome与12306