新闻中心
C++怎么进行单元测试与Mocking_C++ Google Mock框架(gmock)使用指南
首先配置gmock环境并定义接口,接着创建Mock类模拟依赖行为,然后在测试中通过EXPECT_CALL设定调用期望与返回值,最后验证实际调用是否符合预期。

在C++项目中进行单元测试时,我们常常需要隔离被测代码的依赖,比如数据库访问、网络请求或复杂的类交互。这时候就需要使用Mocking技术。Google Mock(gmock)是Google Test(gtest)的配套框架,专门用于模拟(Mock)接口行为,验证函数调用,是C++中主流的Mock框架之一。
一、环境准备与基本配置
要使用gmock,首先需要引入Google Test和Google Mock库。你可以通过以下几种方式获取:
- 使用包管理器安装:如vcpkg、conan或apt(Linux)。
- 从源码编译:从GitHub仓库克隆googletest,其中包含gmock。
示例:使用CMake引入gmock
cmake_minimum_required(VERSION 3.14) project(my_test_project) <h1>引入 Google Test(包含 gmock)</h1><p>include(FetchContent) FetchContent_Declare( googletest URL <a href="https://www.php.cn/link/a8d7ddfb1a52643b880728e1fb453493/archive/refs/tags/v1.14.0.zip">https://www.php.cn/link/a8d7ddfb1a52643b880728e1fb453493/archive/refs/tags/v1.14.0.zip</a> ) FetchContent_MakeAvailable(googletest)</p><h1>添加可执行测试文件</h1><p>enable_testing() add_executable(test_example test.cpp)</p><h1>链接 gmock_main(自动包含 gtest 和 gmock)</h1><p>target_link_libraries(test_example gmock_main)
这样就可以在测试代码中直接使用gmock功能。
二、定义接口并创建Mock类
gmock要求你为需要模拟的类定义一个抽象接口(基类),然后继承testing::Mock来创建Mock实现。
示例:定义一个数据服务接口
class DataService {
public:
virtual ~DataService() = default;
virtual int fetchData(int id) = 0;
virtual bool s*eData(int id, const std::string& data) = 0;
};
创建对应的Mock类
#include <gmock/gmock.h> <p>class MockDataService : public DataService { public: MOCK_METHOD(int, fetchData, (int id), (override)); MOCK_METHOD(bool, s*eData, (int id, const std::string& data), (override)); };
MOCK_METHOD宏用于声明模拟方法。语法为:
MOCK_METHOD(return_type, method_name, (arg_list), (qualifiers...));
其中(override)表示该方法重写了基类虚函数,C++11以后推荐加上。
三、在测试中使用Mock对象
接下来,在测试中注入Mock对象,设定预期行为,并验证调用情况。
美图云修
商业级AI影像处理工具
50
查看详情
示例:测试一个依赖DataService的业务类
class DataProcessor {
public:
explicit DataProcessor(DataService* service) : service_(service) {}
<pre class="brush:php;toolbar:false;">std::string process(int id) {
int value = service_->fetchData(id);
if (value > 100) {
service_->s*eData(id, "large");
return "large";
} else {
service_->s*eData(id, "small");
return "small";
}
}private: DataService* service_; };
编写测试用例
#include <gtest/gtest.h>
#include <gmock/gmock.h>
<p>using ::testing::Return;
using ::testing::Exactly;
using ::testing::_;
using ::testing::Test;</p><p>TEST(DataProcessorTest, ReturnsLargeWhenValueGreaterThan100) {
MockDataService mockService;
DataProcessor processor(&mockService);</p><pre class="brush:php;toolbar:false;">// 设定期望:fetchData(42) 返回 150
EXPECT_CALL(mockService, fetchData(42))
.WillOnce(Return(150));
// 验证 s*eData 被调用一次,且第二个参数为 "large"
EXPECT_CALL(mockService, s*eData(42, "large"))
.Times(1);
std::string result = processor.process(42);
EXPECT_EQ(result, "large");}
关键点说明:
-
EXPECT_CALL设置对Mock方法的调用期望。 -
WillOnce(Return(value))指定返回值。 -
_可作为通配符匹配任意参数。 - 测试结束时,gmock会自动验证所有期望是否满足。
四、常用Matcher与行为控制
gmock提供了丰富的匹配器(Matcher)和行为(Action)来灵活控制Mock逻辑。
常见Matcher示例
EXPECT_CALL(mockService, fetchData(_)); // 任意参数
EXPECT_CALL(mockService, fetchData(42)); // 参数等于42
EXPECT_CALL(mockService, fetchData(Gt(100))); // 大于100
EXPECT_CALL(mockService, s*eData(42, StartsWith("s"))); // 字符串前缀匹配
多种返回行为
.WillOnce(Return(42)); .WillOnce(Return(true)).WillOnce(Return(false)); // 第一次true,第二次false .WillRepeatedly(Return(0)); // 后续调用都返回0 .WillOnce(DoAll(PrintArg<0>(), Return(100))); // 执行多个动作
你也可以自定义Action或验证调用顺序:
Sequence s; EXPECT_CALL(mockService, fetchData(42)).InSequence(s); EXPECT_CALL(mockService, s*eData(_, _)).InSequence(s);
这表示两个调用必须按顺序发生。
基本上就这些。掌握gmock的核心在于理解Mock类的定义方式、EXPECT_CALL的使用以及如何设置返回值和验证调用。结合gtest,你可以构建出稳定可靠的C++单元测试体系。实际项目中建议将Mock对象通过依赖注入传入,便于解耦和测试。整个过程不复杂但容易忽略细节,比如忘记加virtual或override会导致Mock失效,需多加注意。
以上就是C++怎么进行单元测试与Mocking_C++ Google Mock框架(gmock)使用指南的详细内容,更多请关注其它相关文章!
# 测试中
# 家居关键词排名公司
# 关键词网站优化批发
# 东区seo优化找哪家
# 陕西网站优化团队建设方案
# 网站更换ip影响优化吗
# 常州哪些网站建设优化
# 关键词seo排名选择21火星软件
# 榆林网站首页推广
# 火麒麟网站优化
# 设备网站建设生产
# 链表
# 面试题
# 内存管理
# 单元测试
# 如何实现
# 如何使用
# 返回值
# 你可以
# 美图
# red
# google
# c++
# ai
# github
# go
# git
# linux
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
Django通过AJAX异步上传图片并保存至模型的完整指南
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
马斯克:Optimus 人形机器人复数形式为 Optimi
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
夸克浏览器图书入口 夸克手机浏览器阅读入口
Win11怎么开启省电模式_Win11电池节电模式自动开启
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
多闪网页版在线观看免费入口_多闪官网访问入口
Go语言HTML解析:利用Goquery精准获取指定元素内容
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
J*aScript中安全有效地处理localStorage字符串数据
服务端验证_j*ascript输入检查
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
React Router 嵌套组件中 URL 重定向问题的解决方案
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
Golang指针如何与map组合使用_Golang map指针组合实践
qq游戏手机版下载安装_qq游戏移动端入口
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
Linux如何构建多环境配置管理_Linux多环境配置方案
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
outlook中文官网入口地址 outlook官方中文版直达首页链接
AO3最新官网入口公告_2025AO3镜像站实时查询方法
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
抖音创作助手登录入口_抖音创作辅助工具官网直达
解决移动端滚动问题的overflow属性应用指南
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全
Pygame教程:解决用户输入与游戏状态更新不同步问题
谷歌google账号怎么注册账号 谷歌账号注册官方流程
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
mcjs网页版在线存档 mcjs云存档登录入口
深入理解Promise链:如何在catch后中断then的执行
css链接悬停下划线样式如何自定义_使用::after结合content和transition
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
在Pyomo中实现基于变量的条件约束:Big-M方法详解
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技


2025-11-25
浏览次数:次
返回列表
s MockDataService : public DataService {
public:
MOCK_METHOD(int, fetchData, (int id), (override));
MOCK_METHOD(bool, s*eData, (int id, const std::string& data), (override));
};