Google测试如何将InvokeArgument与WithArg一起使用

GoogleTest how to use InvokeArgument With WithArg

本文关键字:WithArg 一起 InvokeArgument 测试 Google      更新时间:2023-10-16

>我有一个模拟函数:

MOCK_METHOD4(my_func, int(double, double, void* (*cb) (int), int p1));

我想以第三个参数作为参数调用上述函数的第二个(基于 0 的)参数,即以"p1"作为参数调用"cb"函数。我该怎么做?

我可以使用InvokeArgument调用带有一些自定义值的"cb":

ON_CALL(mockObj, my_func(_, _, _, _)).
                WillByDefault(DoAll(
                        IgnoreResult(InvokeArgument<2>(10)),
                        Return(0)));

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

您可以定义一个ACTION来调用回调。如下所示:

ACTION(CallCb) {
  arg2(arg3);
}
...
ON_CALL(*mockObj, my_func(_, _, _, _))
  .WillByDefault(
     DoAll(CallCb(),
           Return(0)));

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

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

不幸的是,将WithArgInvokeArgument结合起来是行不通的。但是,您可以使用Invoke并匹配传递给模拟方法的回调函数。像这样:

EXPECT_CALL(*m_pInstallManagerMock, my_func(_, _, my_callback, _)).
            WillOnce(DoAll(
                    WithArg<3>(IgnoreResult(Invoke(my_callback))),
                    Return(0)));