关于单元测试的那些事儿,Mockito 都能帮你解决
摘要:相信每一个程序猿在写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 UT
def 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 RouteTableInfo
Mockito.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等您!
相关文章
- 关于pycharm下载tensorflow时报错解决
- 关于android studio 中安装intel haxm问题的解决
- ajax怎么解决报414,关于c#:HTTP错误414。请求URL太长。 asp.net
- 关于浏览器报错:stack overflow at line: 0 的解决法
- 关于解决token过期失效问题「建议收藏」
- fasdmin+uniapp网站解决跨域问题(vue网页+tp接口跨域)
- 【Bug解决】pymongo.errors.OperationFailure: Executor error during find command :: caused by :: Sort exce
- sqlserver还原数据库的时候出现提示无法打开备份设备的解决方法(设备出现错误或设备脱)
- 关于oracle中clob字段查询慢的问题及解决方法
- 解决Oracle错误1400:INSERT语句触发空值约束(oracle错误1400)
- 时间解决Java中Redis的过期时间问题(redisjava过期)
- Oracle问题解决:一步步指导(oracle问题解决)
- 关于ASP操作Access数据库时出现死锁.ldb的解决方法
- Oracle 数据库出现符号=报错的解决方法(oracle出现符号)
- Oracle如何解决锁定引起的问题(oracle关于锁的问题)
- Oracle解决跨单位换算之挑战(oracle关于单位换算)
- MySQL配置中没有ini文件的解决方法(mysql 下没有ini)
- 分析解决Redis集群线上问题的分析与思考(redis集群线上问题)
- 关于Appserv无法打开localhost问题的解决方法
- 关于Iframe如何跨域访问Cookie和Session的解决方法
- 关于svn冲突的解决方法
- PHP关于IE下的iframe跨域导致session丢失问题解决方法