You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为类中同名的非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*());
};

那在测试代码里可以这么分别设置预期:

  1. 非const版本的预期设置
    这个和你原来的写法一致,不需要额外修饰:

    EXPECT_CALL(your_mock_instance, CmdData())
        .WillOnce(Return(const_cast<char*>("non-const test data")));
    
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:25:17