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

gmock中SetArgPointee能否传递变量值的技术咨询

解决GMock中SetArgPointee无法传递变量最新值的问题

首先,你的问题根源在于GMock的SetArgPointee动作是在定义ON_CALL时就完成值绑定的——当你写SetArgPointee<1>(myStoredValue)的时候,它会把此时myStoredValue的初始值(0)拷贝并固定下来,后续myStoredValue的更新不会影响这个动作的行为。

用GMock支持的简洁方案解决

虽然你提到不想用Invoke(),但其实用lambda配合Invoke是非常简洁的,而且完全符合GMock的使用方式,能动态获取变量的最新值:

unsigned int myStoredValue;

// setValue的模拟保持不变
ON_CALL(ddalCpriLink, setValue(_, _))
  .WillByDefault(DoAll(SaveArg<1>(&myStoredValue), Return(RETURN_OK)));

// 修改getValue的模拟,用lambda动态读取myStoredValue的当前值
ON_CALL(ddalCpriLink, getValue(_, _))
  .WillByDefault(DoAll(
    Invoke([&](int /*notImportant*/, unsigned int* value) {
      *value = myStoredValue;
    }),
    Return(RETURN_OK)
  ));

这样每次getValue被调用时,都会实时读取myStoredValue的最新值,完美符合你的需求——如果setValue没被正确调用,myStoredValue会保持初始值(比如0),测试就能检测到这个异常情况,完全不影响测试的合理性。

为什么GMock的SetArgPointee不支持动态变量值?

GMock的预定义动作(比如SetArgPointee、Return等)设计初衷是静态、无状态的:它们在定义时就确定了要使用的值,不会依赖外部变量的变化。这样设计有两个主要原因:

  • 确定性:预定义动作的行为完全可预测,不会因为外部状态的意外修改导致测试结果不稳定。
  • 简洁性:预定义动作语法简单,适合处理不需要动态逻辑的场景。

如果需要依赖外部状态的动态逻辑,GMock提供了Invoke(包括lambda、函数指针、成员函数)和自定义动作的扩展方式,这是框架设计时的职责划分——预定义动作处理简单场景,Invoke处理复杂/动态场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:23:33