将方法参数传递给googlemock中的操作

时间:2012-03-07 10:57:26

标签: c++ googletest googlemock

我使用Gmock进行方法调用,它返回QList heightsFromCsvResult的元素作为out参数。这是目前正在运行的代码:

EXPECT_CALL(*_mockAttributeRepository, getGeometryHeightValues(_,_))
    .WillOnce(DoAll(SetArgReferee<1>(heightsFromCsvResult.at(0)), Return(true)))
    .WillOnce(DoAll(SetArgReferee<1>(heightsFromCsvResult.at(1)), Return(true)))
    .WillOnce(DoAll(SetArgReferee<1>(heightsFromCsvResult.at(2)), Return(true)))
    .WillOnce(DoAll(SetArgReferee<1>(heightsFromCsvResult.at(3)), Return(true)));

来自

的第一个参数lineNumber
getGeometryHeightValues(int lineNumber, QPair<QString, QString>) 

是heightsFromCsvResult.at(lineNumber)的索引。

现在我尝试以更通用的方式使用Gmock:

int* mockLineNumber = new int;
EXPECT_CALL(*_mockAttributeRepository, getGeometryHeightValues(_,_))
   .Times(4)
   .WillRepeatedly(DoAll(SaveArg<0>(mockLineNumber), SetArgReferee<1>(heightsFromCsvResult.at(*(mockLineNumber))), Return(true)));

但是这段代码不起作用,因为mockLineNumber永远不会由Gmock编写。但是EXPECT_CALL很满意。

有没有人在代码中看到问题?

1 个答案:

答案 0 :(得分:4)

在同一 EXPECT_CALL 中使用带有 SaveArg 的变量似乎不起作用,您可以做的是通过自定义操作< / strong>使用参数0设置第二个参数作为传递容器的索引。

ACTION_P(SetArg1WithValueFromPassedArgumentUsingArg0AsIndex, param)
{
  arg1 = param.at(arg0);
} 

int* mockLineNumber = new int;
EXPECT_CALL(*_mockAttributeRepository, getGeometryHeightValues(_,_))
   .Times(4)
   .WillRepeatedly(DoAll(SaveArg<0>(mockLineNumber), SetArg1WithValueFromPassedArgumentUsingArg0AsIndex(heightsFromCsvResult), Return(true)));

除非您需要 mockLineNumber ,否则您可以删除该部分。