新闻详情

新闻详情

首页 / 资讯中心 / 详情

如何用 GoogleMock 验证 mock 对象的析构函数调用时机

发布时间:2026/9/12 13:03:10来源:尧图网络
如何用 GoogleMock 验证 mock 对象的析构函数调用时机
如何用 GoogleMock 验证 mock 对象的析构函数调用时机【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest在单元测试里你有时需要确认某个 mock 对象在正确的时间点被销毁例如验证被测代码在调用bar-A()之后、bar-B()之前释放了*foo这类所有权和生命周期逻辑。googletest 中的 GoogleMock 提供了针对 mock 函数调用顺序的约束机制但MOCK_METHOD宏无法直接作用于析构函数。本文给出项目文档中的标准做法把验证析构时机转换为验证一个普通 mock 方法的调用时机并用InSequence把它嵌入到调用顺序中做验证。为什么不能直接 mock 析构函数析构函数是特殊语法、特殊语义的函数MOCK_METHOD宏对它不工作下面的写法无法通过编译MOCK_METHOD(void, ~MockFoo, ()); // Wont compile!因此 GoogleMock 官方文档gmock_cook_book.md 的 Mocking Destructors 一节给出的替代方案是给 mock 类增加一个普通 mock 方法Die()并让析构函数调用它。这样测试对象何时被销毁就等价于测试Die()何时被调用而后者可以完全用EXPECT_CALL()加调用顺序约束来表达。前提被继承类的析构函数必须是 virtual在写 mock 之前先确认被 mock 接口的析构函数是虚函数。gmock_for_dummies.md 明确指出所有打算被继承的类其析构函数必须是virtual——否则通过基类指针delete对象时派生类的析构函数不会被调用会产生内存泄漏等状态损坏。gmock_faq.md 也把这一点列为排查项如果测试中出现 heapcheck failure而换成真实对象就没问题首先检查被 mock 的类是否有虚析构函数并把非虚的~Base()改为 virtual。文档同时说明如果你使用gtest_main库链接时会自动启用堆检查见下文验证结果。步骤一给 mock 类加 Die() 方法并让析构函数调用它按照 gmock_for_dummies.md 的常规流程写好 mock 类从接口派生、对每个要 mock 的虚函数写MOCK_METHOD之后只需在类里追加两行class MockFoo : public Foo { ... // Add the following two lines to the mock class. MOCK_METHOD(void, Die, ()); ~MockFoo() override { Die(); } };其中...代表你按常规流程为接口其他虚函数写好的 mock 方法MOCK_METHOD会自动生成定义不需要在别处再实现。如果Die()与现有符号重名文档说明换一个名字即可。步骤二用 InSequence 把 Die() 嵌入调用顺序GoogleMock 默认不要求调用按EXPECT_CALL()的书写顺序发生要让所有调用严格按顺序执行需要在代码块中定义一个InSequence变量块内的期望就构成一个序列乱序调用会由 gMock 直接报错参见 gmock_cook_book.md 的 Expecting Ordered Calls 一节。把Die()放进序列就能断言 mock 对象的销毁时机。以下测试来自文档原文MockFoo* foo new MockFoo; MockBar* bar new MockBar; ... { InSequence s; // Expects *foo to die after bar-A() and before bar-B(). EXPECT_CALL(*bar, A()); EXPECT_CALL(*foo, Die()); EXPECT_CALL(*bar, B()); }含义是*foo必须在bar-A()之后、bar-B()之前被析构。两个注意点mock 对象是在堆上分配的new MockFoo。文档提示如果 mock 对象从未被 delete最终的期望验证就不会发生因此堆上分配 mock 时建议开启堆检查链接gtest_main会自带该检查gmock_for_dummies.md Using Mocks in Tests 一节。gMock 要求所有期望在被 mock 函数被调用之前设置好不要在调用EXPECT_CALL()和调用 mock 函数之间交替进行也不要在把 mock 传给被测 API 之后再补设期望否则行为未定义。验证结果按 quickstart-cmake.md 的方式配置你的测试工程至少需要支持 C17 的编译器与 CMake 及构建工具通过FetchContent引入 googletest 并链接测试主库构建并运行测试后验证分两层顺序断言如果Die()没有落在A()和B()之间即 mock 对象的析构时机不对gMock 会按乱序调用立即报告错误。析构时的自动校验GoogleMock 的工作流程规定当 mock 对象被析构时会自动检查其上的所有期望是否都已满足gmock_for_dummies.md Using Mocks in Tests 第 5 步。例如若Die()从未发生期望计数不匹配会输出类似下面的失败信息以下为文档示例输出path/to/my_test.cc:119: Failure Actual function call count doesnt match this expectation: Actually: never called; Expected: called at least once. Stack trace: ...测试全部通过即说明mock 对象在期望的时间窗口内被析构且其上设置的期望都被满足。限制与边界Die()只是析构的代理信号验证的是析构函数被调用这一时机无法表达析构内部的行为细节。若使用NiceMockT/StrictMockT文档提示当T的析构函数不是 virtual 时它们可能无法正常工作reference/mocking.md。这与前文基类析构必须 virtual的要求一致。InSequence会强制序列内所有期望严格有序如果只关心部分调用的相对顺序可改用 Partial Order 一节介绍的Sequence/After()机制避免测试过于脆弱。参考文档gmock_cook_book.md、gmock_for_dummies.md、gmock_faq.md、quickstart-cmake.md。【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

2025大语言模型技术突破与应用趋势 2026/9/12 13:42:14

2025大语言模型技术突破与应用趋势

1. 2025年大语言模型发展全景回顾2025年对于大语言模型领域而言堪称"技术奇点"之年。作为深度参与多个开源项目的从业者,我亲眼见证了这一年从模型架构到应用生态发生的根本性变革。与2024年相比,模型推理效率提升3-8倍(视具体架构…

阅读更多 →
LLM如何革新自然语言处理与AI应用开发 2026/9/12 13:42:14

LLM如何革新自然语言处理与AI应用开发

1. 为什么LLM正在重塑AI原生应用开发三年前我接手一个智能客服项目时,团队花了六个月构建意图识别模型,准确率勉强达到82%。上个月用LLM重构同样功能,两周内就实现了94%的准确率——这就是大语言模型带给开发者的现实红利。LLM(La…

阅读更多 →
TradingAgents-CN Docker 容器化部署指南:一键构建股票分析环境 2026/9/12 13:42:14

TradingAgents-CN Docker 容器化部署指南:一键构建股票分析环境

TradingAgents-CN Docker 容器化部署指南:一键构建股票分析环境 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN TradingAgents-CN 是…

阅读更多 →
HC-SR501+ESP32零基础入门:人体感应实战指南 2026/9/12 13:42:14

HC-SR501+ESP32零基础入门:人体感应实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PPSSPP 作弊完整指南:4步玩转CwCheat 2026/9/12 13:42:14

PPSSPP 作弊完整指南:4步玩转CwCheat

PPSSPP 作弊完整指南:4步玩转CwCheat 【免费下载链接】ppsspp A PSP emulator for Android, Windows, Mac, Linux and iOS, written in C. Want to contribute? Join us on Discord at https://discord.gg/5NJB6dD or just send pull requests / issues. 项目地址…

阅读更多 →
CAD算量与审图效率低?实战解析算审通插件工作流与配置技巧 2026/9/12 13:39:14

CAD算量与审图效率低?实战解析算审通插件工作流与配置技巧

刚接到一套施工图的时候,整个 CAD 界面几百个图层、上千个块、密密麻麻的标注,要想在一两天内把工程量捋清、把图纸问题筛完,光靠肉眼一条条看,日子是真的没法过。做工程的人应该都有这种体会:算量半小时,对…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞