zoukankan      html  css  js  c++  java
  • 关于单元测试的那些事儿,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有些许的差别,这些如果感兴趣的话都可以参考下官方文档:

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

     

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

  • 相关阅读:
    微软API集
    如何在Visual Studio.net中让同一解决方案中包含多个不同类型的项目并共享同一命名空间
    总结:Asp.net页面之间传递参数的几种方法
    Javascript 鼠标滑过显示大图的效果
    HttpContext.Current.Session["key"]取值
    数字金额转大写
    整合多个图片到一个pdf
    .net reflector & disassembler
    yacc grammar for a simple shell
    Windows cmd编码
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/15042974.html
Copyright © 2011-2022 走看看