写点什么

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

发布于: 1 小时前

​​​​摘要:相信每一个程序猿在写 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 有些许的差别,这些如果感兴趣的话都可以参考下官方文档:



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


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

发布于: 1 小时前阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
关于单元测试的那些事儿,Mockito 都能帮你解决