使用gtest Mock类编译报no matching function for call错误求助
Gmock WillOnce传入lambda编译报错排查
报错原因
- 类型不匹配:Gmock的
WillOnce方法要求入参为testing::Action<F>类型,除非是1.10及以上的高版本Gmock做了适配,否则原生lambda无法直接隐式转换为该类型,这是本次编译报错的直接原因。 - 成员函数调用逻辑错误:lambda内调用的
MakeSetAttrCfg是MockCCHandler的非静态成员函数,你当前使用的[&]捕获仅能捕获GetMockPtr函数的栈局部变量,无法拿到正确的MockCCHandler实例指针来调用成员方法,就算解决了类型转换问题,运行时也会出现非法访问错误。
解决方法
修改GetSetAttInfo对应的EXPECT_CALL代码,做两处调整:
- 用
::testing::Invoke包裹lambda,完成到Action<F>类型的转换 - 修正lambda捕获逻辑,显式捕获你创建的
cc_handler实例指针,用于调用成员函数MakeSetAttrCfg
修改后的代码如下:
EXPECT_CALL(*cc_handler, GetSetAttInfo(::testing::_, ::testing::_)) .Times(1) .WillOnce(::testing::Invoke([cc_handler](const string& business_direction, vector<SetAttrCfg>& set_attributes) { set_attributes = cc_handler->MakeSetAttrCfg(); }));
可选优化建议
你当前的GetMockPtr是MockCCHandler的非静态成员函数,但函数内部又新建了一个MockCCHandler实例,逻辑上存在冗余,建议将GetMockPtr改为静态成员函数,避免外部调用时需要先实例化一个无用的MockCCHandler对象才能获取mock指针。
内容的提问来源于stack exchange,提问作者fffisherman
相关产品推荐
相关产品推荐

