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

发表于:2021-7-26 09:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:数据湖爱好者    来源:华为云社区

  相信每一个程序猿在写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)
  }

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号