GoogleTest之gMock:创建Mock

news2024/9/24 23:33:29

目录

  • MOCK_METHOD
  • mock方法的访问属性
  • mock重载函数
  • mock模板类
  • mock非虚函数
  • mock自由函数
  • Nice/Strict/Naggy
  • mock方法简化参数
  • mock具体类的替代方法
  • 代理给fake

mock是用来模拟对象,隔离边界的一种测试方法,以便在开发阶段不需要依赖第三方或其他依赖项可以进行独立的测试。

MOCK_METHOD

定义一个普通类,使用MOCK_METHOD 宏生成mock方法。MOCK_METHOD 宏有三到四个参数,前三个参数为函数签名分成的三部分(返回值,函数名,参数),第四个参数为以下一个或多个:

  • const:使这个mock方法成为一个const函数,如果重写的函数时const函数,则这个是必须的。
  • override:同C++中的override,如果是重写虚函数,建议加上该关键字
  • noexpect:如果重写的函数时noexpect,那mock方法也是要加上的
  • Calltype(…):
  • ref(…):
    MOCK_METHOD 形如:MOCK_METHOD(int, my_func, (int x, string y), (const, override));

mock方法的访问属性

不管base class中函数的属性是哪种,mock方法必须都是public。因为这样ON_CALL和EXPECT_CALL可以在mock类外访问。

mock重载函数

重载函数的mock和其他函数没有任何特殊之处

mock模板类

mock非虚函数

mock非虚函数的mock类除了使用MOCK_METHOD 定义的mock函数签名一样外,其他和原类没有任何关系了。

class ConcretePacketStream {
 public:
  void AppendPacket(Packet* new_packet);
  const Packet* GetPacket(size_t packet_number) const;
  size_t NumberOfPackets() const;
};

class MockPacketStream {
 public:
  MOCK_METHOD(const Packet*, GetPacket, (size_t packet_number), (const));
  MOCK_METHOD(size_t, NumberOfPackets, (), (const));
};

实际上相当于重新写了和真实类不相关的mock类,只是保持了类函数签名一样。在mock类中可以按实际需要mock函数,不需要mock原类中的所有函数。
mock非虚函数需要在编译期就要决定是哪个对象,这一点不像虚函数。解决这个问题的一种方法是模板化你的代码。在生产代码中使用原类,在测试代码中使用mock类作为模板参数传入(策略模式)

mock自由函数

无法mock一个自由函数(不是类的成员函数都叫自由函数),但是可以通过实现一个接口类,在继承这个接口类的函数中调用这个free functon实现mock它的功能。

class FileInterface {
 public:
  ...
  virtual bool Open(const char* path, const char* mode) = 0;
};

class File : public FileInterface {
 public:
  ...
  bool Open(const char* path, const char* mode) override {
     return OpenFile(path, mode);
  }
};

Nice/Strict/Naggy

TEST(...) {
  MockFoo mock_foo;
  EXPECT_CALL(mock_foo, DoThis());
  ... code that uses mock_foo ...
}

如果mock函数没有EXPECT_CALL但是被调用了。这种被称为不感兴趣的调用,会有告警信息。如下:
在这里插入图片描述
如果要忽略这种信息,可以使用NiceMock<MockFoo>代替mock_foo
NiceMock<MockFoo>是MockFoo的一个子类。以下方式调用完之后没有uninsterestring信息。

using ::testing::NiceMock;
TEST(test_override, mock_override02) {
    NiceMock<MockFoo> foo;   // 使用NiceMock<MockFoo>代替MockFoo
    EXPECT_CALL(foo, Add(::testing::_))
    .Times(1)
    .WillRepeatedly(testing::Return(12));

    EXPECT_EQ(foo.DoThis(), 12);
}

StrictMock 的用法和NiceMock一样,期望所有的不感兴趣的调用失败。(看输出结果和NiceMock基本一样,不知道有啥区别?)
注意事项:

  • NiceMock<MockFoo> and StrictMock<MockFoo>只作用于使用MOCK_METHOD 宏定义的mock函数中,如果mock函数定义在MockFoo的base类中,NiceMock或StrictMock不会影响它。
  • 如果MockFoo 类的析构是非虚函数,NiceMock<MockFoo>StrictMock<MockFoo>可能不会正常工作

mock方法简化参数

mock具体类的替代方法

通过给具体类定义一个父接口类的方式

代理给fake

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#,码海拾贝(31)——约化“对称矩阵“为“对称三对角阵“的“豪斯荷尔德Householder变换法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

运维小白必学篇之基础篇第九集:Linux文件管理实验

Linux文件管理实验 实验作业&#xff1a; 1、筛选/etc/issue文件中的空行 2、筛选/etc/passwd文件中以“bash”结尾的行 3、筛选/etc/passwd文件中以“sync”开头的行 4、列出/etc/passwd文件中包含“dns”的行,并显示行号 5、创建a1-a3.txt3个文件&#xff0c;使用tar命令将这…

基于GD32的定时器不完全详解--定时、级联

SysTick 定时器 SysTick 是一个 24 位的倒计数定时器&#xff0c;当计到 0 时&#xff0c;将从 RELOAD 寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除&#xff0c; 就永不停息。 该定时器的介绍在MCU的手册中一般不会介绍&#xff0c;因为…

MySQL server安装记录

1 安装Notepad 运行下载的 npp.7.9.Installer.x64.exe 2 安装MySQL 将mysql-8.0.22-winx64.zip解压缩&#xff0c;我将其放置D盘根目录下。 进入文件夹&#xff0c;在目录中新建文件夹data和文件my.ini 用NotePad打开my.ini&#xff0c;输入以下内容并保存&#xff0c;其中目…

讨论和总结 树模型 的三种序列化 方式的区别(模型存储大小、序列化所用内存、序列化速度)...

一、前言 本文总结常用树模型&#xff1a; rf&#xff0c;xgboost&#xff0c;catboost和lightgbm等模型的保存和加载&#xff08;序列化和反序列化&#xff09;的多种方式&#xff0c;并对多种方式从运行内存的使用和存储大小做对比 二、模型 2.1 安装环境 pip install xgboos…

「车型分析」移动机器人控制系统典型应用车型 ——叉式移动机器人(AGV/AMR)

叉式移动机器人&#xff08;AGV/AMR&#xff09;是一种常见的移动机器人类型&#xff0c;它摆脱传统的人车操作&#xff0c;自动导航行驶&#xff0c;具有强大的柔性和智能性。叉式移动机器人&#xff08;AGV/AMR&#xff09;不同于传统叉车&#xff0c;它无需人工驾驶运行。具…

Spring纯注解开发模式让开发简化更简化

目录 一.注解开发二.注解定义Bean三.衍生注解四.纯注解开发模式五.注解实现注入 1.自动装配2.按名称注入3.简单数据注入4.读取properties配置文件六.Spring整合MyBatis 一.注解开发 以前跟老韩学习SE时他就说&#xff1a; 注解本质是一个继承了Annotation 的特殊接口,其具体…

龙华商业中心片区旧改:总建面161万平,分5个片区进行建设。

龙华商业旧改&#xff1a;总建面约161万平分5个片区进行建设 据了解&#xff0c;整个龙华商业旧改整体包含北、中、东、南一、南二五个片区&#xff0c;各个片区均整体实施。 更新单元南一片区项目&#xff08;金地宸峯府&#xff09;&#xff0c;拆除用地面积30836.8平方米&…

前4月同比增长超50%,这条座舱智能化赛道国产化率逼近50%

车市行情的低迷&#xff0c;并没有影响智能化人机交互功能的需求增长。 根据高工智能汽车研究院监测数据显示&#xff0c;2023年1-4月中国市场&#xff08;不含进出口&#xff09;乘用车标配HUD&#xff08;W/AR&#xff09;搭载交付55.36万辆&#xff0c;同比增长54.98%&…

附录2-小程序常用API

API有三大类&#xff0c;事件监听API&#xff0c;同步API&#xff0c;异步API 事件监听API都以on开头&#xff0c;比如wx.onWindowResize()监听窗口尺寸变化事件 同步API都以Sync结尾&#xff0c;同步API可以通过函数返回值直接获取&#xff0c;执行出错会抛出异常。比如 wx.…

健康管理系统开发笔记

健康管理系统 项目介绍功能架构项目结构maven项目搭建 项目介绍 健康管理系统是一款应用于健康管理机构的业务系统&#xff0c;实现健康管理机构工作内容 可视化、会员管理专业化、健康评估数字化、健康干预流程化、知识库集成化&#xff0c;从而提 高健康管理师的工作效率&a…

12.页面导航

页面导航 是 页面之间的相互跳转&#xff0c;我们在浏览器中可以使用 a链接 与 location.href 进行跳转 在小程序中可以使用 声明式导航(navigator标签&#xff0c;类似于a标签) 与 编程式导航(使用小程序导航API&#xff0c;类似于location.href) 来跳转页面 目录 1 声明式…

软考A计划-电子商务设计师-电商设计师重点

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

VS2019社区版和QT安装记录

下载 VS2019&#xff1a; Visual Studio 2019 版本 16.11 发行说明 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes选择第一个&#xff0c;下载社区版。或者这里下载。 比较简单的方式就是直接打开&#xff0c;网络安装。但微…

camunda如何清理或归档历史数据

一、camunda如何清理历史数据 Camunda 提供了多种方式可以清理历史数据。以下是一些常见的方式&#xff1a; 1、使用 HistoryService#deleteHistoricProcessInstance 方法&#xff1a;该方法用于删除指定的历史流程实例以及与之关联的所有历史数据&#xff0c;包括历史任务、…

【微波实验1】 T形波导的内场分析及优化设计

实验目的 熟悉并掌握HFSS的工作界面、操作步骤及工作流程。掌握T型波导功分器的设计方法、优化设计方法和工作原理。 实验仪器 1、 装有windows 系统的PC 一台 2、 HFSS15.0 或更高版本软件 实验原理 本实验所要分析的器件是下图所示的一个带有隔片的T形波导。其中&#…

SpringBoot 设置动态定时任务,千万别再写死了~

怎么在SpringBoot项目中简单使用定时任务&#xff0c;不过由于要借助cron表达式且都提前定义好放在配置文件里&#xff0c;不能在项目运行中动态修改任务执行时间&#xff0c;实在不太灵活。 经过网上搜索学习后&#xff0c;特此记录如何在SpringBoot项目中实现动态定时任务。…

MySQL查询序号带小数点问题

案例&#xff1a; SELECT (num:num1) AS index, name, age FROM sys_user, (SELECT num:0) AS a order by age,name; 查询结果&#xff1a; datagrip和dbeaver查询结果不一样&#xff0c;使用cmd查询&#xff0c;默认也是无小数点的 但实际返回结果&#xff0c;其实是带点的 D…

CocosCreator制作地图外物品位置向导(指引/地图标点)

演示 图解 code goldTips&#xff1a;指引节点&#xff0c;更改位置使用 goldTipRotate&#xff1a;指引节点的子节点中具有指向性的节点&#xff0c;一般为带箭头&#xff0c;尖角等。 protected lateUpdate(dt: number): void {//可以不在lateUpdate中操作&#xff0c;…

【020】C++的动态内存申请new和delete

C的动态内存申请new和delete 引言一、动态分配内存的概述二、静态分配和动态分配三、new和delete3.1、new和delete操作基本类型空间3.2、new和delete操作数组空间 四、new和delete的重载五、动态分配内存的优缺点总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程…