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

GoogleMock如何根据被mock函数的入参变量返回对应值

错误原因

你的写法无法编译是因为GoogleMock的Action使用逻辑搞错了:

  • WithArg<N>的作用是把mock调用时第N位的参数提取出来,传给它包裹的内部Action
  • Return(X)的作用是调用发生时直接返回X这个值,你写Return(FakeOutParams)相当于试图返回一个函数指针,和mock方法要求返回OutParams结构体的签名不匹配,自然编译失败
  • SaveArgPointee的作用是把指针类型入参指向的内容拷贝到外部变量,你的入参是const引用,本身就不适用于这个场景。
解决方案

用Invoke Action即可,它会把mock调用收到的参数透传给你指定的可调用对象(函数、lambda、仿函数都可以),可调用对象的返回值就是mock调用的返回值,完全满足「返回值依赖入参」的需求:

auto fake_wrapper = new MockMyClass();
// 直接透传所有参数给FakeOutParams,参数签名完全匹配,不需要额外处理
EXPECT_CALL(*fake_wrapper, TransformParams(_))
      .WillRepeatedly(Invoke(FakeOutParams));

如果伪造逻辑比较简单,也可以直接写lambda,不用单独定义全局的FakeOutParams函数:

EXPECT_CALL(*fake_wrapper, TransformParams(_))
      .WillRepeatedly(Invoke([](const InParams& in_param) {
          return OutParams{in_param.important_value, 1};
      }));

如果是多参数的mock方法,你只想把某一个位置的参数传给伪造函数,也可以搭配WithArg使用,注意内部包裹的是Invoke不是Return:

// 提取第0位参数传给FakeOutParams,忽略其他位置的参数
EXPECT_CALL(*fake_wrapper, TransformParams(_))
      .WillRepeatedly(WithArg<0>(Invoke(FakeOutParams)));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:51:36