GoogleTest如何在WithArg中使用InvokeArgument

usm*_*man 5 c++ googletest googlemock

我有一个模拟功能:

MOCK_METHOD4(my_func, int(double, double, void* (*cb) (int), int p1));
Run Code Online (Sandbox Code Playgroud)

我想以第三个参数作为参数调用上述函数的第二个(基于0的)参数,即,以“ p1”作为参数调用“ cb”函数。我怎样才能做到这一点?

我可以使用InvokeArgument调用带有某些自定义值的“ cb”:

ON_CALL(mockObj, my_func(_, _, _, _)).
                WillByDefault(DoAll(
                        IgnoreResult(InvokeArgument<2>(10)),
                        Return(0)));
Run Code Online (Sandbox Code Playgroud)

但是我想使用传递给相同的模拟函数调用的实际参数来调用它。

Min*_*ine 5

您可以定义一个ACTION来调用您的回调。像下面这样:

ACTION(CallCb) {
  arg2(arg3);
}

...

ON_CALL(*mockObj, my_func(_, _, _, _))
  .WillByDefault(
     DoAll(CallCb(),
           Return(0)));
Run Code Online (Sandbox Code Playgroud)


Ant*_*rez 3

由于按DoAll顺序处理操作,您可以将第三个参数值保存到外部变量,然后使用该变量作为参数调用第二个参数。

int p;
ON_CALL(mockObj, my_func(_, _, _, _)).
            WillByDefault(DoAll(
                    SaveArg<3>(&p),
                    IgnoreResult(InvokeArgument<2>(p)),
                    Return(0)));
Run Code Online (Sandbox Code Playgroud)