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

使用gtest Mock类编译报no matching function for call错误求助

Gmock WillOnce传入lambda编译报错排查

报错原因

  1. 类型不匹配:Gmock的WillOnce方法要求入参为testing::Action<F>类型,除非是1.10及以上的高版本Gmock做了适配,否则原生lambda无法直接隐式转换为该类型,这是本次编译报错的直接原因。
  2. 成员函数调用逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:54:05