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

