2016-07-07 34 views
2

我有一个模拟功能:GoogleTest如何使用InvokeArgument随着WithArg

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

我想要调用第二(从0开始)上面的函数的与所述第三参数作为参数变量,即,调用“CB”功能以“p1”作为参数。我怎样才能做到这一点?

我可以调用“CB”使用InvokeArgument一些自定义的值:

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

但我想传递给相同的嘲笑函数调用的实际参数来调用它。在序列

回答

1

由于DoAll流程操作,您可以第三个参数的值保存到一个外部变量,然后调用与该变量作为参数的第二个参数。

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

您可以定义一个ACTION来调用您的回调。类似下面:

ACTION(CallCb) { 
    arg2(arg3); 
} 

... 

ON_CALL(*mockObj, my_func(_, _, _, _)) 
    .WillByDefault(
    DoAll(CallCb(), 
      Return(0))); 
0

不幸的是,结合WithArgInvokeArgument不起作用。但是,你可以使用Invoke并匹配传递给嘲笑方法的回调函数。事情是这样的:

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