gtest/gmock如何编写返回vector<tuple<int,int>>的mock函数EXPECT_CALL
问题原因
- 编译报错本质是Action和函数签名不匹配:你mock的
function()是无参数函数,但你在期望配置里用了SetArrayArgument<0>、SetArgPointee<1>这两个专门操作函数入参的Action。这类Action会按下标取函数的入参做赋值操作,无参函数根本没有第0、第1个入参,gmock内部调用std::get<0>取参数时自然找不到匹配对象,直接触发编译错误。 - 返回值逻辑写错了:你定义的
function()是直接把std::vector<std::tuple<int,int>>作为返回值返回,不是靠指针、引用类型的出参往回传数据,完全不需要用操作入参的Action来塞数据,直接返回你提前构造好的测试数据就行。
修正方案
直接把预设的测试数据作为返回值传给Return动作即可,不需要多余的入参操作,修正后的测试代码如下:
TEST_F(TestClass, testname) { using vectorOfTuple = std::vector<std::tuple<int,int>>; // 提前构造好要返回的测试数据 vectorOfTuple getAllValues = { {10,2}, {20,2}, {30,2}, {40,2} }; // 配置期望:每次调用都直接返回预设的测试数据 EXPECT_CALL(A_mock, function()) .WillRepeatedly(Return(getAllValues)); // 调用接口时直接用变量接收返回值,就能拿到全部预设数据 vectorOfTuple result = A_mock.function(); }
额外说明
如果你实际业务里的function是靠出参回传vector内容、用返回值传元素个数的接口,那你得先改类A和对应mock的函数签名,给函数加上对应类型的出参,再用SetArrayArgument这类Action操作入参。但根据你给出的现有类定义,function是无参直接返回vector的接口,上面的写法就是正确的。另外你原来代码里Return传的是空的result变量,就算不报错也拿不到你填的测试数据,要传提前构造好的getAllValues。
内容的提问来源于stack exchange,提问作者Ashwini Pai
相关产品推荐
相关产品推荐

