4

我使用 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 是满意的。

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

4

1 回答 1

5

在同一个EXPECT_CALL中使用带有SaveArg的变量集似乎不起作用,您可以做的是执行一个自定义操作,该操作使用参数 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其他东西,否则您可以删除该部分。

于 2012-03-07T13:42:41.047 回答