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

如何为gmock中const重载方法的ON_CALL设置默认返回值?

解决GMock中const/非const重载方法的ON_CALL返回值设置问题

这个问题的核心在于GMock需要明确区分const和非const的成员函数重载,同时返回值的类型必须和方法声明完全匹配,不能依赖隐式转换。我来一步步拆解解决方案:

问题根源分析

  1. 未匹配到const方法:你最初写的ON_CALL(*ptr, func())默认匹配的是非const版本的func(),当代码调用const对象的func()时,GMock找不到对应的动作,自然提示未设置默认行为。
  2. 类型不匹配编译错误:std::shared_ptr<const A>和std::shared_ptr<A>是完全不同的类型,无法直接将前者的引用转换为后者的引用——这是C++的类型安全限制,GMock的ReturnRef要求返回值类型必须和方法返回的引用类型严格一致。

正确的解决方案

我们需要分别为两个重载方法设置独立的ON_CALL,并且用Const()标记const版本的匹配:

1. 准备对应类型的返回值实例

// 对应const版本func的返回值:const A的shared_ptr
std::shared_ptr<const A> const_a_ptr = std::make_shared<const A>();
// 对应非const版本func的返回值:非const A的shared_ptr
std::shared_ptr<A> non_const_a_ptr = std::make_shared<A>();

2. 为const版本的func设置ON_CALL

关键是在ON_CALL末尾加上.Const(),告诉GMock这是匹配const成员函数的调用:

ON_CALL(*ptr, func())
    .Const()  // 必须添加这个标记来匹配const重载
    .WillByDefault(ReturnRef(const_a_ptr));

3. 为非const版本的func设置ON_CALL

直接使用非const的实例即可,不需要额外标记:

ON_CALL(*ptr, func())
    .WillByDefault(ReturnRef(non_const_a_ptr));

完整代码示例

#include <gmock/gmock.h>
#include <memory>

class A {};

class MockClass {
public:
    MOCK_METHOD(const std::shared_ptr<const A>&, func, (), (const));
    MOCK_METHOD(const std::shared_ptr<A>&, func, ());
};

TEST(ExampleTest, OverloadedFuncTest) {
    std::unique_ptr<MockClass> ptr = std::make_unique<MockClass>();

    std::shared_ptr<const A> const_a_ptr = std::make_shared<const A>();
    std::shared_ptr<A> non_const_a_ptr = std::make_shared<A>();

    // 匹配const成员函数
    ON_CALL(*ptr, func())
        .Const()
        .WillByDefault(ReturnRef(const_a_ptr));

    // 匹配非const成员函数
    ON_CALL(*ptr, func())
        .WillByDefault(ReturnRef(non_const_a_ptr));

    // 测试const调用
    const auto& const_result = ptr->func();
    EXPECT_EQ(const_result, const_a_ptr);

    // 测试非const调用
    const auto& non_const_result = ptr->func();
    EXPECT_EQ(non_const_result, non_const_a_ptr);
}

这样设置后,无论是调用const还是非const版本的func(),GMock都能正确匹配到对应的返回动作,同时也不会出现类型转换的编译错误。

内容的提问来源于stack exchange,提问作者KabCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:35:28