0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Mockito是什么 什么情况下使用Mockito

ouxn_HW_Digital 来源:华为开发者社区 作者:华为开发者社区 2021-08-09 14:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

相信每一个程序猿在写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.googlecode.com/hg/org/mockito/Mockito.html

项目源码:

https://github.com/mockito/mockito

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115628
  • 代码
    +关注

    关注

    30

    文章

    4940

    浏览量

    73118
  • REST
    +关注

    关注

    0

    文章

    33

    浏览量

    9830

原文标题:干货| 干了这杯Mockito鸡尾酒,让你轻松进行单元测试

文章出处:【微信号:HW-DigitalHome,微信公众号:华为数字家庭】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问DTU的设备号都在什么情况下需要填写,填写的规则是什么?

    DTU的设备号都在什么情况下需要填写,填写的规则是什么?
    发表于 08-07 07:50

    请问CYW20835在sleep mode的情况下,不进入SDS或HIDOF的情况下,底电流最低是多少?

    请问CYW20835在sleep mode的情况下,不进入SDS或HIDOF的情况下,底电流最低是多少?
    发表于 07-07 07:54

    DS1232LPS-2+T&R,在什么情况下,5脚RST会一直输出高电平?

    DS1232LPS-2+T&R,这款芯片在什么情况下,5脚RST会一直输出高电平?(正常时序是上电有个400多ms的高电平后,一直处于低电平,如果7脚没有及时喂狗,会触发复位,也就是重复400多ms的高电平后,一直处于低电平)
    发表于 04-18 07:51

    无感直流BLDC,大占空比情况下失步怎么解决?

    无感直流BLDC,大占空比情况下失步问题
    发表于 03-11 08:00

    DLPC350管角FAULT_STATUS是什么含义,什么样的情况下这个指示灯会亮?

    ,这个指示灯会亮,具体是在什么情况下,这个指示灯会亮呢?或者说在哪些情况下,这个指示灯会亮。 帮忙解答,感谢。
    发表于 02-26 08:20

    DLPA3000 ILLUM_HSIDE_DRIVE ILLUM_LSIDE_DRIVE这二个脚外置MOS是什么情况下可以用?

    ILLUM_HSIDE_DRIVEILLUM_LSIDE_DRIVE这二个脚外置MOS是什么情况下可以用
    发表于 02-21 06:00

    gd32f470在什么情况下会进入会进入reset_handler?

    reset_handler了,请问啥情况下会进入reset_handler啊?除了芯片通电第一次,cpu的复位脚说是也没接出来按理来说也不会影响它的
    发表于 01-22 06:37

    ADS5474模数转换器的VCM和VREF引脚在什么情况下使用?

    请介绍一ADS5474模数转换器的VCM和VREF引脚在什么情况下使用? 文档上说VCM是在直流耦合应用时用于设置共模电压,是不是指前级驱动电路使用放大器的时候?如果前面直接使用变压器耦合成差分
    发表于 01-13 08:04

    ADS1115未接传感器的通道会不时的出现数值,这是什么情况

    最近做了块AD采样的板子,在其中1路接传感器,其他3路不接传感器的情况下,接传感器的读数正常,而未接传感器的通道会不时的出现数值。这是什么情况?怎么解决?望大家给点意见
    发表于 01-09 06:47

    MSP430F4250的四种模式分别是在什么情况下使用呢?

    我是一名初学者,看了书知道MSP430F4250的AD转换模式有四种,我想知道这四种转化模式有什么区别,分别应该在什么情况下使用。各位高手能否为我解答哈,在下不胜感激。因为是初学者,有很多东西都不知道,能尽量详细就尽量哈,谢谢了。
    发表于 01-06 06:16

    ldc1614EVM评估版背面的没焊电容时用来干嘛的?在什么情况下使用?

    请教一个关于ldc1614EVM的问题,评估版背面的没焊电容时用来干嘛的?在什么情况下使用?
    发表于 01-02 08:23

    ADS1278数据输出引脚Dout1有脉冲输出是什么情况

    ADS1278配置成SPI TDM模式,CLK时钟24MHz,在SCLK没给时钟的情况下,用示波器观察Dout1管脚就不规则脉冲输出,宽度大约6us,周期不定。另外DRDY有规律性脉冲输出,宽度大约50ns,间隔60us,请问这是什么情况
    发表于 12-31 06:12

    LM98620的offset寄存器值什么情况下起作用?

    我想问下LM98620 的offset寄存器值什么情况下起作用?我是通过FPGA设置的,6个C_OFFS_XX寄存器和6个F_OFFS_XX都设置了,但是波形没有整体抬升或者下降。 另外,我在
    发表于 12-23 07:48

    在VDD1没有供电的情况下,VDD2正常供电的情况下,AMC1200的输出应该是什么状态?

    请教一,在前端VDD1没有供电的情况下,VDD2正常供电的情况下,AMC1200的输出状态为什么P端是3.8V ,N端是1.2V ,每一次都是这样子, 请问,在VDD1没有供电的情况下
    发表于 12-17 07:37

    ads1291正弦波显示超出幅值是什么情况,怎么解决?

    1.这个是输出1P,1N串电阻的情况,5mV的正弦波,但是在心电图采集显示屏上显示就是严重超过幅值,请问是什么情况? 2.这个是输出1P,1N串电容加电阻的情况,5mV显示都是好的,但是在采集,或者短接的
    发表于 12-17 06:01