文章目录

  • gmock vs mockcpp
    • 1 基本介绍
    • 2 语法风格与使用方式
      • gmock 特点(基于接口 Mock):
      • mockcpp 特点(基于重写/拦截原函数):
    • 3 对比总结
    • 4 实际使用建议

gmock vs mockcpp

gmockmockcpp 是 C++ 中常用的两个 Mock 框架,用于单元测试时模拟对象或函数的行为。

它们的核心目标相似:使测试更加隔离、可控与可验证,但两者在设计理念、使用方式、语法风格、兼容性等方面存在明显差异。


1 基本介绍

项目gmock(Google Mock)mockcpp
作者Google东南大学(何海涛等)
语言C++(与 gtest 紧密集成)C++
发布时间2008 年左右2006 年左右
依赖Google Test (gtest)无需 gtest,可与其它测试框架搭配

2 语法风格与使用方式

gmock 特点(基于接口 Mock):

  • 基于接口/抽象类设计(需要提前设计好虚函数接口)
  • 使用宏定义 MOCK_METHOD() 快速生成 Mock 函数
  • 测试语句直观如:EXPECT_CALL(mockObj, Foo()).Times(1);
  • 支持匹配器(_, Eq(x), AnyOf, AllOf 等)
  • 语法现代、类型安全,支持 C++11+
class ICalc {
public:virtual int Add(int a, int b) = 0;virtual ~ICalc() = default;
};class MockCalc : public ICalc {
public:MOCK_METHOD(int, Add, (int a, int b), (override));
};TEST(MyTest, Addition) {MockCalc calc;EXPECT_CALL(calc, Add(1, 2)).WillOnce(Return(3));ASSERT_EQ(calc.Add(1, 2), 3);
}

mockcpp 特点(基于重写/拦截原函数):

  • 不依赖接口或虚函数,可以对 非虚函数/全局函数/静态函数 进行 Mock
  • 使用 MOCKER(methodName).stubs().will(returnValue()); 风格
  • 内部使用函数地址重写、hook 技术等实现原函数替换
  • 支持打桩(Stub)与调用验证
  • 适合 legacy code(老代码)测试,不易侵入原设计
class Calc {
public:int Add(int a, int b) { return a + b; }
};TEST_F(MyTest, AddMock) {MOCK_METHOD(Calc, Add).stubs().will(returnValue(42));Calc calc;ASSERT_EQ(calc.Add(1, 2), 42);
}

3 对比总结

特性gmockmockcpp
Mock 方式基于虚函数接口函数地址拦截,可 Mock 普通函数
对老代码支持差,需重构为虚接口强,无需修改原代码
语法风格现代,强类型安全,表达式链式调用类似脚本语言的 DSL,易用但类型不安全
调用验证支持 EXPECT_CALL支持 .expects().with(...)
可测试对象虚函数、成员函数所有函数(包括静态函数、全局函数)
依赖关系依赖 gtest独立,兼容多种测试框架
编译兼容性高度依赖编译器特性,现代 GCC/Clang 更好支持低层 hook,有些编译器和系统下不稳定
适合应用新代码、接口良好的模块老代码、未封装接口的遗留项目

4 实际使用建议

  • 如果你在做现代 C++ 项目(C++11+)并使用 gtest 作为测试框架,推荐使用 gmock,配合 gtest 效果更佳;
  • 如果你在维护遗留项目、无法改写为虚函数接口,或者需要对 静态函数、全局函数、第三方库函数进行打桩,推荐使用 mockcpp;
  • 也可以在一个项目中同时使用 gmock 和 mockcpp,根据不同的模块情况选择合适的 Mock 方式。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自己的服务器被 DDOS跟CC攻击了怎么处理,如何抵御攻击?

今天后台突然弹出警报:服务器带宽瞬间跑满,CPU 占用率飙到 100%。刷新页面时,首页加载像卡带般断断续续,图片刚显示半张就卡住,点击任何按钮都没反应。登录服务器一看,访问日志里密密麻麻全是陌生 IP 的高频…

icg真的只能用latch不能用Flip-flop吗

soc设计中常用latch来做时钟门控,它的rtl描述如下: input EN; input clk; input TE; output E_clk;always (*) beginif (clk1d0)E_latch EN | TE; endassign E_clk E_latch & clk;实际soc实现会把上面代码中latch和与操作换成专用CLKLANQ的libcel…

基于python大数据的nba球员可视化分析系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

从0开始学习R语言--Day22--km曲线

KM曲线 在分析疾病的死亡率时,我们往往会纠结于怎样在逻辑架构中去考虑未死亡的人群,以及想研究两种药物的表现效果,但病人的指标表现都不明显,作用于其他指标且很难量化。 而KM曲线可以很好地反映人群在时间序列上的生存率&…

SpringBoot ​@ControllerAdvice 处理异常

应用中的异常,有两件事要考虑,怎么处理这个异常,怎么把异常可读性高地返回给前端用户 1.怎么把异常可读性高的返回给前端用户或API的消费者 自定义错误代码和错误内容 2.怎么处理异常 比如遇到某个异常时需要发邮件通知IT团队 Controlle…

爬百度图片如何解决{“antiFlag“:1,“message“:“Forbid spider access“}

在学习深度学习的卷积神经算法时,需要猫和狗的训练数据集。这时想到在百度网上爬取猫和狗的图片。 在爬取狗狗图片的时候,我抓包分析了下获取这个url1 “https://image.baidu.com/search/index?tnbaiduimage&ipnr&ct201326592&cl2&lm&…

QWebEngine

Qt自带的QWebEngine 不支持播放MP4, 需要手动编译QWebEngine模块 不支持播放mp4 // mainwindow.cpp , m_webEngine(new MyWebEngine(this)) void MainWindow::init() { //关闭系统代理,提高速度,采用release会更快QNetworkProxyFactory::setUseSystemConfigurati…

Rust 学习笔记1

Basic基础 actix_web基础 #[get("/favicon")] 获取静态图片 #[get("/welcome")] 简单的欢迎 #`/user/{name}/` basic.rs源码 源码 use std::{convert::Infallible, io};use actix_files::{Files, NamedFile}; use actix_session::{storage::Cooki…

3GPP协议PDF下载

https://www.tech-invite.com/3m38/tinv-3gpp-38.html 可以进入3GPP官网界面,也可以进入PDF下载界面 PDF加载比较慢

高性能服务器程序框架知识梳理

服务器编程框架 服务器程序种类有很多,但是基本框架都一样,核心不同点在于逻辑处理单元。基本框架包含:I/O处理单元、逻辑单元、网络存储单元以及请求队列。 I/O处理单元(主线程):服务器用来管理客户连接…

【AI】从0开始玩转混元3D⼤模型,如何让一张静态实物图片一键转为3D实物图,大模型都表示服了,超级简单易上手,快来试试!

HAI 与 NVIDIA ,为开发者提供一键部署及生图的能力,让开发者体验3D 模型的同时,也了解云的便利性。 混元3D 2.0是腾讯推出的尖端3D⽣成模型,能够创建带有⾼分辨率纹理贴图的⾼保真3D资产 参赛报名:https://marketing.c…

电路图识图基础知识-电动机的保护电路保护方式(二十六)

电动机保护电路是确保电动机安全、可靠运行的关键技术之一。在工业和日常生活中,电动机被广泛应用于各种设备中,其安全运行对于保障生产效率和人身安全至关重要。本文将详细介绍电动机保护电路的重要性、保护方式以及具体的电路分析,以期为电…

【Pandas】pandas DataFrame droplevel

Pandas2.2 DataFrame Reshaping sorting transposing 方法描述DataFrame.droplevel(level[, axis])用于**从 DataFrame 的索引(行或列)中删除指定层级(level)**的方法 pandas.DataFrame.droplevel() pandas.DataFrame.droplev…

Delivering Arbitrary-Modal Semantic Segmentation(CVPR2023)任意模态语义分割论文阅读

文章目录 文章研究思路创建了DeLiVER任意模态分割基准数据集统计信息4种模态25个语义类 提出了任意跨模态分割模型CMNeXt自查询中心(Self-Query Hub,SQ-Hub)并行池化混合器(Parallel Pooling Mixer,PPX) 实…

进程控制

一. 进程创建 1.fork的概念与使用 在 Linux 中 fork 可以在一个进程中创建一个新的进程。这个新进程称为子进程&#xff0c;原进程为父进程。使用前需要包含头文件 #include <unistd.h> 。在调用 fork 函数时&#xff0c;子进程与父进程会共享数据和代码&#xff0c;此…

造轮子系列:从0到1打造生产级HTTP客户端,优雅封装OkHttp/HttpClient,支持异步、重试与文件操作

TechZhi HTTP Client Starter 源码特性快速开始1. 添加依赖2. 配置3. 使用 主要功能支持的HTTP方法文件操作功能高级功能配置示例 API使用示例基本请求自定义请求异步请求文件操作示例错误处理 构建和测试依赖说明 本文将介绍一款本人开发的高性能Spring Boot HTTP客户端Starte…

Java过滤器的基本概念

概述 Java 过滤器是 Java EE (Jakarta EE) 中的一种组件&#xff0c;用于在请求到达 Servlet 或 JSP 之前对其进行预处理&#xff0c;或者在响应返回客户端之前对其进行后处理。过滤器主要应用于以下场景&#xff1a; 请求参数过滤和转换字符编码处理身份验证和授权日志记录压…

gbase8s数据库获取jdbc/odbc协议的几种方式

PROTOCOLTRACEFILED:\sqltrace1.log;PROTOCOLTRACE5 jdbc 参数 &#xff0c;明文协议&#xff0c;并发时 会错乱&#xff0c;适合单线程调试 SQLIDEBUGC:\Users\lenovo\Desktop\sqlidebug.log1 jdbc参数&#xff0c;密文协议&#xff0c;需使用解密工具解析&#xff0c;解析…

【android bluetooth 框架分析 04】【bt-framework 层详解 7】【AdapterProperties介绍】

前面我们提到了 蓝牙协议栈中的 Properties &#xff0c; 这篇文章是 他的补充。 【android bluetooth 框架分析 04】【bt-framework 层详解 6】【Properties介绍】 在 AOSP&#xff08;Android Open Source Project&#xff09;中&#xff0c;AdapterProperties 是一个 Java…

C盘瘦身?

突然发现回收站底部有横幅辣眼睛&#xff01; 点击深度清理跳转C盘瘦身 点击一键瘦身跳转支付 回收站右键还有菜单 回收站右键可以通过设置关闭 回收站底部横幅关不了&#xff01; 流氓没人管了吗&#xff1f;