单元测试Mockito中的Mock和Spy
转载:https://blog.csdn.net/qq_30141957/article/details/81273829
项目中,有些函数需要处理某个服务的返回结果,而在对函数单元测试的时候,又不能启动那些服务,这里就可以利用Mockito工具。Mockito中的Mock和Spy都可用于拦截那些尚未实现或不期望被真实调用的对象和方法,并为其设置自定义行为。二者的区别在于:
1、Mock声明的对象,对函数的调用均执行mock(即虚假函数),不执行真正部分。
2、Spy声明的对象,对函数的调用均执行真正部分。
例:
- public class Main {
- public void fun(String s) {
- System.out.println(s + " : fun");
- fun1(s);
- fun2(s);
- }
- public void fun1(String s) {
- System.out.println(s + " : fun1");
- }
- private void fun2(String s) {
- System.out.println(s + " : fun2");
- }
- public int getVal(){
- return 5;
- }
- }
Mock使用实例
1、使用doCallRealMethod().when()调用函数真正部分。
2、使用when().thenReturn自定义函数返回值。
- import static org.mockito.ArgumentMatchers.anyString;
- import static org.mockito.Mockito.doCallRealMethod;
- import static org.mockito.Mockito.when;
- import org.junit.Before;
- import org.junit.Test;
- import org.mockito.Mock;
- import org.mockito.MockitoAnnotations;
- public class MainTest {
- @Mock
- Main mockMain;
- @Before
- public void init() {
- MockitoAnnotations.initMocks(this);
- }
- @Test
- public void testFun() {
- // 执行mock,而不是真正部分,所以没有打印任何信息
- mockMain.fun("mock test One");
- // doCallRealMethod声明后,执行真正部分
- // 但是Mock只能对public(fun1)和protected函数进行mock
- // 对private函数(fun2)仍执行真正部分
- // 所以输出fun和fun2
- doCallRealMethod().when(mockMain).fun(anyString());
- mockMain.fun("mock test Two");
- // 执行mock,输出int的默认值0,而不是5
- System.out.println("val: " + mockMain.getVal());
- // when声明后,既不走真正部分,也不走mock,直接返回thenReturn()中定义的值
- // 注意:该值的类型需要和when中函数返回值类型一致
- when(mockMain.getVal()).thenReturn(10);
- System.out.println("val: " + mockMain.getVal());
- }
- }
Spy使用实例
1、使用when().thenReturn自定义函数返回值。
- import static org.mockito.Mockito.when;
- import org.junit.Before;
- import org.junit.Test;
- import org.mockito.MockitoAnnotations;
- import org.mockito.Spy;
- public class MainTest {
- @Spy
- Main spyMain;
- @Before
- public void init() {
- MockitoAnnotations.initMocks(this);
- }
- @Test
- public void testFun() {
- // 执行真正部分
- spyMain.fun("mock test One");
- // 执行真正部分
- System.out.println("val: " + spyMain.getVal());
- // 自定义返回值
- when(spyMain.getVal()).thenReturn(10);
- System.out.println("val: " + spyMain.getVal());
- }
- }
参考文章:
2、@mock和@spy在mock私有方法的区别,使用@spy模拟私有方法进行测试时sonar统计是有覆盖率的
单元测试Mockito中的Mock和Spy的更多相关文章
- Mockito中的@Mock和@Spy如何使用
相同点 spy和mock生成的对象不受spring管理 不同点 1.默认行为不同 对于未指定mock的方法,spy默认会调用真实的方法,有返回值的返回真实的返回值,而mock默认不执行,有返回值的,默 ...
- 单元测试系列之五:Mock工具之Mockito实战
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6780719.html 在实际项目中写单 ...
- mockito中两种部分mock的实现,spy、callRealMethod
什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现). 为什么需要部分mock? A:当需要测试一个 ...
- Mockito中@Mock与@InjectMock
Mockito是java单元测试中,最常用的mck工具之一,提供了诸多打桩方法和注解.其中有两个比较常用的注解,@Mock和@InjectMock,名字和在代码中使用 的位置都很像,对于初学者,很容易 ...
- 单元测试:单元测试中的mock
公司要求提升单元测试的质量,提高代码的分支覆盖率和行覆盖率,安排我研究单元测试,指定方案分享并在开发部普及开.整理完资料后,同步一下到博客. 单元测试中的mock的目的 mock的主要目的是让单元测试 ...
- 使用Mockito进行单元测试【1】——mock and verify[转]
本文转自:http://qiuguo0205.iteye.com/blog/1443344 1. 为什么使用Mockito来进行单元测试? 回答这个问题需要回答两个方面,第一个是为什么使用mock?m ...
- Mockito 中文文档 ( 2.0.26 beta )
Mockito 中文文档 ( 2.0.26 beta ) 由于缺乏校对,难免有谬误之处,如果发现任何语句不通顺.翻译错误,都可以在github中的项目提出issue.谢谢~ Mockito框架官方地址 ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
随机推荐
- MyEclipse使用总结——MyEclipse中配置WebLogic12c服务器
MyEclipse中配置WebLogic12c服务器的步骤如下: [Window]→[Preferences],如下图所示: 找到WebLogic的配置,如下图所示:
- FTP主动模式与FTP被动模式所需的端口
转载自:http://www.mofang.net/article/272/sort0963/2008/Article_11581.shtml FTP是仅基于TCP的服务,不支持UDP. 与众不同的是 ...
- Java知识回顾 (2) Java 修饰符
一.Java 修饰符 1.1 访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default (即缺省,什么也不写): 在 ...
- C# CSGL
转.修改自ShareIdeas文章C# 基于CSGL opengl OpenGL是一个功能强大的开放图形库(Open Graphics Library).其前身是SGI公司为其图形工作站开发的IRIS ...
- redis缓存web session
redis缓存web session 首先说下架构图.使用Redis作为会话服务器,统一管理Session.如图,集群里的WEB服务器共享存放在REDIS里面全部的客户端SESSION. 当然,反向代 ...
- 怎样正确的使用Cookie的Path详细解析
原文地址:http://java-zone.org/1052.html cookie 有路径--path,表示哪些路径下的文件有权限读取该 cookie. path 应该以 “/” 结尾,同名 coo ...
- Odoo9发行说明
2015年10月1日,期待已久的Odoo9正式发布.本文是Odoo9正式版发行说明,基于官网资料翻译. 译者: 苏州-微尘原文地址:https://www.odoo.com/page/odoo-9-r ...
- springboot redis多数据源设置
遇到这样一个需求:运营人员在发布内容的时候可以选择性的发布到测试库.开发库和线上库. 项目使用的是spring boot集成redis,实现如下: 1. 引入依赖 <dependency> ...
- Java 8新的时间日期库的20个使用示例
原文链接 作者:Javin Paul 译者:之诸暇 除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学 ...
- Android之Android apk动态加载机制的研究
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587 (来自singwhatiwanna的csdn博客) 背景 问题 ...