mockito——让你轻松地进行单元测试的强大工具

举报
我爱次火锅锅 发表于 2021/07/13 11:54:00 2021/07/13
【摘要】 相信每一个程序猿在写Unit Test的时候都会碰到一些令人头疼的问题:如何测试一个rest接口;如何测试一个包含客户端调用服务端的复杂方法;如何测试一个包含从数据库读取数据的复杂方法。。。这些问题mockito都可以帮我们轻松地解决。

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

Mockito是啥?

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


什么情况下使用Mockito 

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

Mockito的使用:

  • 引进依赖

Maven依赖如下:

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

代码中:import org.mockito.Mockito

  • 创建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)
}
  • 配置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有些许的差别,这些如果感兴趣的话都可以参考下官方文档:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。