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

GMock中expect_call通过SaveArg保存的参数如何用于后续Mock调用校验

问题原因

你的写法不生效的核心原因是:EXPECT_CALL在定义阶段就会对传入的匹配参数做值捕获,此时savedPar_还是空的默认值,后续DoSomething执行时修改savedPar_的操作,不会同步到已经定义好的DoSomething2期望匹配规则中,因此会出现匹配失败。

解决方法

使用std::cref包装需要延迟校验的变量,让Eq匹配器在实际调用DoSomething2的时刻才读取savedPar_的当前值,同时修复你代码里的语法错误(多余的逗号、多余括号)后,正确写法如下:

#include <functional> // 引入std::cref所需头文件

EXPECT_CALL(mockd_, DoSomething(_, _))
                .WillOnce(DoAll(SaveArg<1>(&savedPar_), Return(Ok)));
       
EXPECT_CALL(mockd_, DoSomething2(Eq(std::cref(savedPar_))))
                .WillOnce(Return(Ok)); 

sut_->work();

如果需要严格保证DoSomething必须在DoSomething2之前调用,避免时序异常导致的校验错误,可以额外增加Sequence约束:

#include <functional>
#include <gmock/gmock.h>
using ::testing::Sequence;

Sequence call_seq;
EXPECT_CALL(mockd_, DoSomething(_, _))
                .InSequence(call_seq)
                .WillOnce(DoAll(SaveArg<1>(&savedPar_), Return(Ok)));
       
EXPECT_CALL(mockd_, DoSomething2(Eq(std::cref(savedPar_))))
                .InSequence(call_seq)
                .WillOnce(Return(Ok)); 

sut_->work();

注意事项

  • 确保DoSomething传入的第二个const char*参数在SaveArg执行时是有效的,不会出现悬空指针导致保存的字符串异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:57:04