如何为类中同名的非const与const重载方法设置EXPECT_CALL?
区分const与非const同名Mock方法的EXPECT_CALL设置方法
这个问题我之前踩过同款坑!Google Mock默认会优先匹配非const版本的方法,但其实只要用一个简单的修饰符就能精准区分这两个同名方法,分别设置调用预期。
核心解决思路
C++里的const成员函数和非const版本属于不同的函数签名,Google Mock通过Const()这个特殊修饰符来标记你要匹配的是const版本的方法。
具体代码示例
假设你的Mock类定义是这样的:
class TargetClass { public: virtual char* CmdData() = 0; virtual const char* CmdData() const = 0; }; class MockTargetClass : public TargetClass { public: MOCK_METHOD0(CmdData, char*()); MOCK_CONST_METHOD0(CmdData, const char*()); };
那在测试代码里可以这么分别设置预期:
非const版本的预期设置
这个和你原来的写法一致,不需要额外修饰:EXPECT_CALL(your_mock_instance, CmdData()) .WillOnce(Return(const_cast<char*>("non-const test data")));const版本的预期设置
只需要在EXPECT_CALL的方法调用后加上.Const()即可:EXPECT_CALL(your_mock_instance, CmdData()) .Const() // 关键!标记匹配const成员函数 .WillOnce(Return("const test data"));
注意事项
要触发const版本的预期,你必须通过const对象、const引用或者const指针来调用CmdData(),这是C++本身的重载决议规则决定的,比如:
// 触发非const版本 char* non_const_result = your_mock_instance.CmdData(); // 触发const版本 const MockTargetClass& const_mock_ref = your_mock_instance; const char* const_result = const_mock_ref.CmdData();
这样就能分别为两个同名方法设置独立的调用预期啦!
内容的提问来源于stack exchange,提问作者Geob-o-matic
相关产品推荐
相关产品推荐

