如何为gmock中const重载方法的ON_CALL设置默认返回值?
解决GMock中const/非const重载方法的ON_CALL返回值设置问题
这个问题的核心在于GMock需要明确区分const和非const的成员函数重载,同时返回值的类型必须和方法声明完全匹配,不能依赖隐式转换。我来一步步拆解解决方案:
问题根源分析
- 未匹配到const方法:你最初写的
ON_CALL(*ptr, func())默认匹配的是非const版本的func(),当代码调用const对象的func()时,GMock找不到对应的动作,自然提示未设置默认行为。 - 类型不匹配编译错误:
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
相关产品推荐
相关产品推荐

