全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何进行单元测试mocking_使用Google Mock为C++测试创建模拟对象

使用Google Mock可解决C++单元测试中依赖外部组件的问题。首先通过CMake等工具集成gMock,接着将代码依赖抽象为接口,如定义Database基类,再用MOCK_METHOD宏创建MockDatabase模拟其行为。在测试中,通过EXPECT_CALL设定对mock方法的调用期望,例如参数匹配、返回值和调用次数,并注入mock对象到被测类如UserService中,从而验证逻辑正确性。gMock还支持InSequence控制调用顺序、Times指定调用次数及自定义回调动作,提升测试灵活性。关键是依赖倒置与接口抽象,使测试专注逻辑而非协作者。

在C++中进行单元测试时,依赖外部组件(如数据库、网络服务或硬件接口)会使测试变得复杂且不稳定。为了解决这个问题,可以使用 mocking 技术来模拟这些依赖行为。Google Mock(简称 gMock)是 Google Test 框架的一部分,专门用于创建和管理模拟对象,帮助你隔离被测代码并验证其交互逻辑。

什么是 Mocking?

Mocking 是指用一个可控的“替身”对象替代真实依赖,这个替身能模拟真实对象的行为,并允许你检查方法是否被调用、调用次数以及参数是否正确。这在测试中非常有用,特别是当你想专注于某个类的逻辑而不受其协作者影响时。

集成 Google Mock 到项目中

Google Mock 通常与 Google Test 一起使用。你可以通过以下方式之一将其引入项目:

  • 使用 CMake 和 FetchContent:适合现代 C++ 项目。
  • 从源码构建并安装:下载 googletest 仓库,编译并安装到系统路径。
  • 使用包管理器:如 vcpkg 或 conan 安装 gtest + gmock。
示例:使用 CMake 添加 Google Mock

在 CMakeLists.txt 中添加:

include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip
)
FetchContent_MakeAvailable(googletest)

启用 gmock

target_link_libraries(your_test_target gtest_main gmock)

编写可测试代码:依赖抽象

要使用 mock,你的代码必须依赖于接口(抽象类),而不是具体实现。例如:

class Database {
 public:
  virtual ~Database() = default;
  virtual bool save(const std::string& key, const std::string& value) = 0;
  virtual std::string read(const std::string& key) = 0;
};

class UserService { public: explicit UserService(Database* db) : db_(db) {}

bool createUser(const std::string& username) { return db_->save("user:" + username, username); }

private: Database* db_; };

这样我们就可以为 Database 创建一个 mock 实现来进行测试。

使用 Google Mock 创建模拟对象

使用 MOCk_METHOD 宏定义 mock 类的方法:

#include 

class MockDatabase : public Database { public: MOCK_METHOD(bool, save, (const std::string&, const std::string&), (override)); MOCK_METHOD(std::string, read, (const std::string&), (override)); };

现在可以用这个 mock 替代真实的数据库。

在测试中使用 Mock 对象

结合 Google Test 编写测试用例:

#include 
#include 

using ::testing::Return; using ::testing::Eq; using ::testing::ByRef;

TEST(UserServiceTest, SaveCallsDatabaseSave) { MockDatabase mock_db; UserService service(&mock_db);

// 设定期望:当 save 被调用时返回 true EXPECT_CALL(mock_db, save(Eq("user:alice"), Eq("alice"))) .WillOnce(Return(true));

bool result = service.createUser("alice"); EXPECT_TRUE(result); }

这里的关键点:

  • EXPECT_CALL 设置对 mock 方法的调用期望。
  • 可以匹配参数(如 Eq)、检查调用次数等。
  • WillOnce(Return(...)) 指定返回值。

高级特性:验证调用顺序和多次调用

Google Mock 支持更复杂的场景:

// 验证调用顺序
{
  testing::InSequence seq;
  EXPECT_CALL(mock_db, save("x", "y"));
  EXPECT_CALL(mock_db, read("x"));
}

// 匹配任意参数 EXPECT_CALL(mock_db, save).Times(2); // 被调用两次即可

// 使用回调或自定义动作 EXPECT_CALL(mockdb, read).WillOnce([](const std::string& key) { return "mocked" + key; });

小结

使用 Google Mock 可以有效提升 C++ 单元测试的质量。关键是将依赖抽象成接口,在测试中用 mock 对象代替真实实现,并通过 EXPECT_CALL 验证交互行为。配合 Google Test,能够写出清晰、可靠、可维护的测试代码。

基本上就这些。只要结构合理,mock 就不会难用。


# git  # go  # github  # 工具  # ai  # c++  # google  # 接口  # 对象  # database  # 数据库  # 测试中  # 自定义  # 回调  # 并安装  # 返回值  # 单元测试  # 你可以  # 协作者  # 是指  # 可以用 


相关文章: html制作网站的步骤有哪些,iapp如何添加网页?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  网站制作网站,深圳做网站哪家比较好?  如何设置并定期更换建站之星安全管理员密码?  黑客入侵网站服务器的常见手法有哪些?  C++时间戳转换成日期时间的步骤和示例代码  三星网站视频制作教程下载,三星w23网页如何全屏?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  宝塔Windows建站如何避免显示默认IIS页面?  盘锦网站制作公司,盘锦大洼有多少5G网站?  如何快速启动建站代理加盟业务?  如何高效完成自助建站业务培训?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  专业网站建设制作报价,网页设计制作要考什么证?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  再谈Python中的字符串与字符编码(推荐)  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何在Windows虚拟主机上快速搭建网站?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何用美橙互联一键搭建多站合一网站?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  制作企业网站建设方案,怎样建设一个公司网站?  如何规划企业建站流程的关键步骤?  郑州企业网站制作公司,郑州招聘网站有哪些?  如何在阿里云购买域名并搭建网站?  建站三合一如何选?哪家性价比更高?  如何选择PHP开源工具快速搭建网站?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  香港服务器部署网站为何提示未备案?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何在香港免费服务器上快速搭建网站?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  制作销售网站教学视频,销售网站有哪些?  如何设计高效校园网站?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  Android自定义控件实现温度旋转按钮效果  大连 网站制作,大连天途有线官网?  制作农业网站的软件,比较好的农业网站推荐一下?  在线制作视频网站免费,都有哪些好的动漫网站?  网站图片在线制作软件,怎么在图片上做链接?  如何通过多用户协作模板快速搭建高效企业网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  php json中文编码为null的解决办法  如何获取开源自助建站系统免费下载链接?  如何通过FTP空间快速搭建安全高效网站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何快速搭建高效香港服务器网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。