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

    文章

    3006

    浏览量

    116828
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74373
  • REST
    +关注

    关注

    0

    文章

    33

    浏览量

    9933

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    VOOHU沃虎:音频变压器的主要作用是什么?什么情况下必须使用?

    纯净度、消除底噪、匹配设备阻抗以及转换信号格式方面发挥着不可替代的作用。然而,许多工程师在选型时常常困惑:音频变压器到底能解决什么问题?哪些场景没有它就“过不去”?今天,沃虎电子(VOOHU)带你深入解析。 一、音频变压器的
    的头像 发表于 04-23 14:03 20次阅读

    电路板是否在没有 tf 卡的情况下启动?

    电路板是否在没有 tf 卡的情况下启动? 主板是否使用没有 tf 卡的 NVMe SSD 启动?
    发表于 03-26 07:14

    请问如何在不按按钮的情况下重置电路板?

    我有一台旧的 Raspberry Pi 1B,我用它通过 UART 照顾 VF2。如果 VF2 无法启动但 u-boot 仍然可以访问,我可以 ssh 进入 RPI 并运行 picocom 来修复它。 如果 VF2 崩溃且无法访问 u-boot,有没有办法在不按重置按钮的情况下重置它?
    发表于 03-20 08:01

    如何设计好自动驾驶ODD?

    为确定自动驾驶的可使用范围,会给自动驾驶设置一个运行设计域(Operational Design Domain,ODD)。ODD的作用就是用来明确自动驾驶在什么情况下能工作,在什么情况下不能工作,给车设定“工作范围”。
    的头像 发表于 01-24 09:27 1738次阅读

    什么情况下用安规电容?

    安规电容指符合特定安规标准,在电容器失效后,不会导致电击,不危及人身安危的电容器,根据应用场景和连接方式的不同,安规电容分为X电容和Y电容。
    的头像 发表于 01-21 17:20 911次阅读
    <b class='flag-5'>什么情况下</b>用安规电容?

    什么情况下用安规电容?

    安规电容是指符合特点安规标准,在电容器失效后,不会导致电击,不危及人身安危的电容器。根据应用场景和链接方式的不同,安规电容分为X电容和Y电容。
    的头像 发表于 01-21 16:40 859次阅读
    <b class='flag-5'>什么情况下</b>用安规电容?

    独立看门狗运行时,SR.RUN不显示1,总是0这是什么情况呢?

    这是什么情况
    发表于 01-21 07:24

    哪些情况下需要用单模光缆

    单模光缆因其独特的传输特性,在需要长距离、高速率、低损耗或抗干扰能力强的通信场景中具有显著优势。以下是需要使用单模光缆的典型情况: 1. 长距离通信需求 跨城/跨国骨干网:单模光缆的传输距离可达数十
    的头像 发表于 01-20 10:45 280次阅读

    如何在“SD 卡 NAND 闪存”的情况下使用 Non-OS NVTFAT?

    如何在“SD 卡 NAND 闪存”的情况下使用 Non-OS NVTFAT
    发表于 09-01 07:58

    如何在没有 NuLink 编程器的情况下执行 SWD 解锁序列?

    我迫切需要知道如何在没有 NuLink 编程器的情况下执行 SWD 解锁序列。
    发表于 08-18 07:04

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

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

    固定式条码扫描器能在条码移动情况下扫描吗?

    在工业生产、物流仓储等场景中,条码扫描往往伴随着物体的动态移动。此时,不少人会产生疑问:固定式条码扫描器能否在条码移动的情况下完成扫描?答案是肯定的,但这一过程受到多种技术因素的制约。固定式条码
    的头像 发表于 08-04 15:18 833次阅读
    固定式条码扫描器能在条码移动<b class='flag-5'>情况下</b>扫描吗?

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

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

    什么情况下用M12线性传感器?

    在工业自动化和精密测量领域,M12线性传感器凭借其独特的性能优势,成为众多行业不可或缺的关键组件。
    的头像 发表于 05-14 14:42 720次阅读

    如何在CYPM1322中不使用内部电源的情况下使用VBUS_C_P引脚实现SINK?

    我想在CYPM1322中不使用内部电源的情况下通过VBUS_C_P1输入电源进行SINK操作,但是由于CC RD功能不起作用,所以无法工作。 当将 5V 作为内部电源施加到 CYPM1322 器件
    发表于 05-08 07:32