摘要:相信每一个程序猿在写Unit Test的时候都会碰到一些令人头疼的问题:如何测试一个rest接口;如何测试一个包含客户端调用服务端的复杂方法;如何测试一个包含从数据库读取数据的复杂方法。。。这些问题mockito都可以帮我们轻松地解决。Mockito是啥?Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外...

本文分享自华为云社区《mockito——让你轻松地进行单元测试的强大工具》,作者:数据湖爱好者。

相信每一个程序猿在写Unit Test的时候都会碰到一些令人头疼的问题:如何测试一个rest接口;如何测试一个包含客户端调用服务端的复杂方法;如何测试一个包含从数据库读取数据的复杂方法。。。这些问题Mockito都可以帮我们轻松地解决。

Mockito是啥?

Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试。简单来说,创建mock对象之后,这个对象里面的方法是怎么实现的可以不用去关心,我们只需要给这个方法定义一个输入、输出即可。

什么情况下使用Mockito:

假设现在要测试method A, method A里面又依赖Method B、Method C、Method D,而依赖的这3个method又不好去构建(如ObsClient需要真实AK SK,HttpClient需要构建客户端与服务器,Database相对好构建,但是假设Method C只是从table1、table2联合查询,你还得分别往table1、table2 insert数据,很繁琐),这时候可以考虑Mockito进行优雅测试,当然如果你想去构建真实的测试场景,未免有点舍本逐末了~~~

Mockito的使用:

1、引进依赖

Maven依赖如下:

<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>1.10.19</version><scope>test</scope>
</dependency>

代码中:import org.mockito.Mockito

2、创建Mock对象

这里需要注意的是scala中只能对伴生对象或者Class创建mock对象,不能直接对Object创建mock对象。Scala中使用Mockito.mock(classOf[…])来创建mock对象

class VpcClient {def getRouteTable(projectId: String, token: String, url: String): Seq[RouteTable] = {val header = Map(RequestAttributes.X_AUTH_TOKEN -> token,"Content-Type" -> MediaType.APPLICATION_JSON)val response = restClient.get(url, header)
}
}
object VpcClient {private lazy val _instance: VpcClient = new VpcClient(conf)private var mockClient: VpcClient = _def getInstance(): VpcClient = {// Keep original logic for other ut, which didn't set mock client.if (RuntimeEnvironment.isTesting && null != mockClient) {return mockClient}_instance}// only used for UTdef setMockClient(vpcClient: VpcClient): Unit = {mockClient = vpcClient}}

举个例子,现在对VpcClient进行mock,从而可以调用VpcClient里面的getRouteTableList方法。

class UtilSuite {val vpcClient = Mockito.mock(classOf[VpcClient])VpcClient.setMockClient(vpcClient)
}

3、配置Mock对象

Mockito.doReturn(routeTableInfo).when(vpcClient).getRouteTable(projectId, token,url)

当我们有了一个 Mock 对象后, 我们可以调用对象的方法,并且使用Mockito.doReturn().when().method,来设置当调用method时,在某输入下返回某输出。这里的输入是要与 method真实的入参一致的,输出也是要与method真实的返回参数一致。

class UtilSuite {val vpcClient = Mockito.mock(classOf[VpcClient])VpcClient.setMockClient(vpcClient)val projectId = "projectId"val token = "token"val url= "url"val routeTableInfo = new RouteTableInfoMockito.doReturn(routeTableInfo).when(vpcClient).getRouteTable(projectId, token, url)
}

总结:

上面讲了Mockito的使用场景,以及scala中怎么使用Mockito创建mock对象。与java中使用Mockito有些许的差别,这些如果感兴趣的话都可以参考下官方文档:

  • 官网:http://mockito.org
  • API文档:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html
  • 项目源码:https://github.com/mockito/mockito

获取更多 AI 相关数据、算法、模型等 AI 资产,请点击“了解更多”,AI Gallery等您!

点击关注,第一时间了解华为云新鲜技术~

关于单元测试的那些事儿,Mockito 都能帮你解决相关推荐

  1. Maven Eclipse Junit单元测试解 + 进阶使用Mockito做service层单测(万物皆可mo)+对于异步async方法的单测

    一:简介 JUnit是一个JAVA语言的单元测试框架 主要是后端写完代码可以自己测试一下功能. 二:配置 2.1 引入 在 pom文件里引入依赖包 <dependency><grou ...

  2. 单元测试中简单使用Mockito解决Spring Bean依赖树问题

    单元测试中简单使用Mockito解决Spring Bean依赖树问题 参考文章: (1)单元测试中简单使用Mockito解决Spring Bean依赖树问题 (2)https://www.cnblog ...

  3. 是的,阿里P7,腾讯T4,字节跳动总监都是你家亲戚!!!都在帮你们整理资料!!!

    缘起 最近网上出现最多的文章就是,阿里P7大佬熬夜整理某资料,腾讯T4大佬良心分享某资料,字节总监耗时多少天整理的某资料,我笑了,这些大佬都是你家亲戚么,都在帮你们整理资料去了,都闲着没事干了么? 我 ...

  4. 2021年office2010每次打开都要配置进度解决方法

    2021年office2010每次打开都要配置进度解决方法 office2010每次打开都要配置进度是什么原因(如下图) 一.第一种原因 ,电脑上安装有金山WPS和office2010会有冲突. 解决 ...

  5. docker加载新的镜像后repository和tag名称都为none的解决方法

    docker加载新的镜像后repository和tag名称都为none的解决方法 参考文章: (1)docker加载新的镜像后repository和tag名称都为none的解决方法 (2)https: ...

  6. localhost和127.0.0.1都无法打开的解决方法

    localhost和127.0.0.1都无法打开的解决方法仅供参考: 若网上搜到方法没有解决你的问题,不妨试下 首先我是系统升级win10后重新正确安装wamp64后,状态为绿色也不能打开localh ...

  7. 一张图看懂Polyspace都能帮你做什么,好强大

    曾经在公众号里不只一次给大家推荐过这个工具和使用方法,通过一张图可以全面了解Polyspace都能帮你做什么,是不是很强大, 目前最新的版本是2016a,有兴趣的可以下载试用版本.让你的代码上Poly ...

  8. 计算机上全部是应用程序,电脑桌面的所有应用程序.exe名称后缀都变成.lnk的解决方法...

    电脑桌面的所有应用程序.exe名称后缀都变成.lnk的解决方法,方法有用可以解决.lhk应用程序全部转换为.exe格式,我们的电脑应用程序后缀格式基本为.exe格式的,但是有时候我们打开一种应用程序时 ...

  9. mysql插入数字都变成2147483647的解决方法

    (2011-10-18 16:57:43) 转载▼ 标签: mysql 数据库 2147483647 杂谈 分类:php基础 在用Excel导入数据的时候,碰到11位的数字都变成2147483647, ...

最新文章

  1. ab apr_socket_recv: Connection reset by peer 错误解决
  2. 解决pathForResource返回nil / 无法读取plist文件问题
  3. zencart 后台 tool-define page editor define define_main_page.php
  4. 手机 com.android.backupconfirm可以删除吗,手机上什么文件可以删除?答案都在这里了...
  5. java服务器向客户端发消息_socket 服务器向指定的客户端发消息
  6. Linux常用编程工具
  7. 目前IT很火,很多人转行,简单培训后进入IT行业,那么这样“速成”的IT从业人员发展前景如何?
  8. 爬虫代理IP产品如何选择
  9. tp交换机管理页面_TP-Link交换机管理设置(RSSManager适合TP-Link楼道交换机)
  10. 【学习记录】SPSS问卷调查表分析法
  11. c语言:素数和(教训,调试时随手写的语句记得删掉)
  12. 扫地机器人作文说明文提纲_扫地机器人的作文
  13. python 通达信数据_如何利用程序(如python) 从新浪财经或者雅虎财经获取到所有A股数据(历史日线数据,实时股票数据)?...
  14. 眼图观测实验报告_眼图观测实验..doc
  15. 凝心聚力,不负好时光——慧慧兔团建拓展之旅
  16. 修改falcon的钉钉告警格式
  17. 啪嗒砰2 全隐藏关 隐藏BOSS
  18. 江苏大学 计算机网络 期末/考研复试 复习
  19. java swing员工工资管理系统(大作业)源码+数据库文件+文档
  20. 手机上颜值测试软件,颜值测试软件大全 测试颜值的软件推荐

热门文章

  1. HTML autofocus
  2. Eigen 矩阵计算工具
  3. php excel下载和使用,PHP:使用PHPExcel完成电子表格文件的导出下载和导入操作_PHP教程...
  4. vuex的命名空间有哪些_javascript – vuex中模块的命名空间究竟是什么
  5. pcb板可挖孔吗_PCB板微孔加工方法之机械钻孔
  6. c 递归下降识别程序_程序员的算法课(3)-递归(recursion)算法
  7. 一维FDTD等离子体的Matlab,修正过的一维FDTD等离子体MATLAB代码(公式修正)
  8. html怎么转换成asp.net,Asp.net中将Word文件转换成HTML的方法
  9. Expected one result (or null) to be returned by selectOne(), but found: 2
  10. css连续的纯数字或字母强制换行