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
相关产品推荐
相关产品推荐

