如何为返回类型为auto的成员函数创建MOCK_METHOD?
解决Google Mock中Mock非虚尾置返回类型函数的问题
问题根源
- 原类
foo中的a()函数不是虚函数:即使子类bar定义了Mock方法,通过父类指针/引用调用时,依然会执行父类的原实现,导致Mock不生效。 MOCK_METHOD(auto, a, (), ())编译失败:Google Mock的MOCK_METHOD宏要求明确指定返回类型,不支持auto作为返回类型参数。
方案1:接口隔离与适配
定义抽象接口类,让原类通过适配类实现该接口,后续测试Mock这个接口即可:
// 定义抽象接口 class IFoo { public: virtual bool a() = 0; virtual ~IFoo() = default; // 必须定义虚析构函数 }; // 适配类,包装原foo类 class FooAdapter : public IFoo { private: foo& m_foo; public: explicit FooAdapter(foo& foo_inst) : m_foo(foo_inst) {} bool a() override { return m_foo.a(); } }; // 定义Mock类 class MockFoo : public IFoo { public: MOCK_METHOD(bool, a, (), (override)); };
测试时,让被测代码依赖IFoo接口:
- 生产环境使用
FooAdapter包装真实的foo实例 - 测试环境使用
MockFoo,并设置预期调用
方案2:模板依赖注入
修改被测代码,使其通过模板参数依赖foo类型,而非直接依赖具体类:
被测代码修改(无需修改原foo类)
// 原本的被测函数 // void process_foo(foo& f) { ... } // 修改为模板函数 template<typename FooLike> void process_foo(FooLike& f) { if (f.a()) { // 业务逻辑 } }
测试用Mock类
class MockFoo { public: MOCK_METHOD(bool, a, (), ()); };
测试示例
TEST(FooTest, ProcessFoo) { MockFoo mock; EXPECT_CALL(mock, a()).WillOnce(testing::Return(true)); process_foo(mock); // 断言逻辑 }
内容的提问来源于stack exchange,提问作者user3416447
相关产品推荐
相关产品推荐

