摘要:置信每一个程序猿在写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.googlecod...
  • 我的项目源码:https://github.com/mockito/mo...

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

点击关注,第一工夫理解华为云陈腐技术~