GoogleMock如何根据被mock函数的入参变量返回对应值
错误原因
你的写法无法编译是因为GoogleMock的Action使用逻辑搞错了:
WithArg<N>的作用是把mock调用时第N位的参数提取出来,传给它包裹的内部ActionReturn(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
相关产品推荐
相关产品推荐

