相信每一个程序猿在写UnitTest的时候都会碰到一些令人头疼的问题:如何测试一个rest接口;如何测试一个包含客户端调用服务端的复杂方法;如何测试一个包含从数据库读取数据的复杂方法。。。这些问题mockito都可以帮我们轻松地解决。Mockito是啥?Mockito是一个强大的用于Java开发的模拟测试框架,通过Mockito我们可以创建和配置Mock对象,进而简化有外...
相信每一个程序猿在写UnitTest的时候都会碰到一些令人头疼的问题:如何测试一个rest接口;如何测试一个包含客户端调用服务端的复杂方法;如何测试一个包含从数据库读取数据的复杂方法。。。这些问题mockito都可以帮我们轻松地解决。
Mockito是啥?
Mockito是一个强大的用于Java开发的模拟测试框架,通过Mockito我们可以创建和配置Mock对象,进而简化有外部依赖的类的测试。简单来说,创建mock对象之后,这个对象里面的方法是怎么实现的可以不用去关心,我们只需要给这个方法定义一个输入、输出即可。
什么情况下使用Mockito:
假设现在要测试methodA,methodA里面又依赖MethodB、MethodC、MethodD,而依赖的这3个method又不好去构建(如ObsClient需要真实AKSK,HttpClient需要构建客户端与服务器,Database相对好构建,但是假设MethodC只是从table1、table2联合查询,你还得分别往table1、table2insert数据,很繁琐),这时候可以考虑Mockito进行优雅测试,当然如果你想去构建真实的测试场景,未免有点舍本逐末了~~~
Mockito的使用:
1、引进依赖
Maven依赖如下:
dependencygroupIdorg.mockito/groupIdartifactIdmockito-core/artifactIdversion1.10.19/versionscopetest/scope/dependency
代码中:importorg.mockito.Mockito
2、创建Mock对象
这里需要注意的是scala中只能对伴生对象或者Class创建mock对象,不能直接对Object创建mock对象。Scala中使用Mockito.mock(classOf[…])来创建mock对象
classVpcClient{defgetRouteTable(projectId:String,token:String,url:String):Seq[RouteTable]={valheader=Map(RequestAttributes.X_AUTH_TOKEN-token,"Content-Type"-MediaType.APPLICATION_JSON)valresponse=restClient.get(url,header)
}
}
objectVpcClient{privatelazyval_instance:VpcClient=newVpcClient(conf)privatevarmockClient:VpcClient=_defgetInstance():VpcClient={//Keeporiginallogicforotherut,whichdidntsetmockclient.if(RuntimeEnvironment.isTestingnull!=mockClient){returnmockClient}_instance}//onlyusedforUTdefsetMockClient(vpcClient:VpcClient):Unit={mockClient=vpcClient}}
举个例子,现在对VpcClient进行mock,从而可以调用VpcClient里面的getRouteTableList方法。
classUtilSuite{
valvpcClient=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真实的返回参数一致。
classUtilSuite{
valvpcClient=Mockito.mock(classOf[VpcClient])VpcClient.setMockClient(vpcClient)
valprojectId="projectId"valtoken="token"valurl="url"valrouteTableInfo=newRouteTableInfo
Mockito.doReturn(routeTableInfo).when(vpcClient).getRouteTable(projectId,token,url)
}
总结:
上面讲了Mockito的使用场景,以及scala中怎么使用Mockito创建mock对象。与java中使用Mockito有些许的差别,这些如果感兴趣的话都可以参考下官方文档: