使用Google C++ Mocking Framework(Google Mock)将任意参数传递给invocked方法(V1.5)

Syl*_*inD 11 c++ parameters unit-testing mocking googlemock

我有一个模拟方法.当它被调用时,我希望它在调用其正常行为之前调用另一个函数.就像是 :

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
    .WillOnce(DoAll(
        Invoke(my_obj, &SomeAdditionalMethodIWantToCall),
        Invoke(my_obj, &DefaultBehavior),
        ));
Run Code Online (Sandbox Code Playgroud)

唯一的问题是SomeAdditionalMethodIWantToCall期望参数与提供的参数完全无关MockedMethod.我希望能够给他们,但我正在努力学习语法.我希望有类似的东西(假句法):

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
    .WillOnce(DoAll(
        Invoke(my_obj, &SomeAdditionalMethodIWantToCall, arg1, arg2, arg3),
        Invoke(my_obj, &DefaultBehavior),
        ));
Run Code Online (Sandbox Code Playgroud)

我在文档中找到了这样的东西而没有任何成功.

使用函数或Functor作为动作时,我们有:

  • Invoke(f),Invoke(object_pointer, &class::method),InvokeWithoutArgs(f),InvokeWithoutArgs(object_pointer, &class::method)这将只是向前(或不)提供给嘲笑功能的参数,当它被调用.

  • InvokeArgument<N>(arg1, arg2, ..., argk) 似乎是为了调用其中一个参数.

复合动作中

  • WithArg<N>(a)并且WithArgs<N1, N2, ..., Nk>(a)似乎是选择转发原始函数中的哪些参数.

我想我错过了一些非常明显的东西,但我有点卡在这里,所以任何建议都会有所帮助.

RA.*_*RA. 8

一种可能的选择是使用Assign操作将参数的值保存到类变量,然后使用帮助器调用其他函数.使用以下期望:

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
    .WillOnce(DoAll(
        Assign(&classVariable1, arg1),
        Assign(&classVariable2, arg2),
        Assign(&classVariable3, arg3),
        InvokeWithoutArgs(my_obj, &MyClass::SomeAdditionalMethodIWantToCallHelper),
        Invoke(my_obj, &MyClass::DefaultBehavior),
        ));
Run Code Online (Sandbox Code Playgroud)

然后按如下方式定义辅助函数:

void MyClass::SomeAdditionalMethodIWantToCallHelper()
{
    SomeAdditionalMethodIWantToCall(classVariable1, classVariable2, classVariable3);
}
Run Code Online (Sandbox Code Playgroud)

编辑

另一种可能的选择是编写一个自定义操作,该操作接收一个指向成员函数的指针以及您希望传递给它的参数.这更接近您最初的语法所需.这是自定义操作:

ACTION_P5(InvokeUnrelatedFunction, classPointer, pointerToMemberFunc,
          first, second, third)
{
    (classPointer->*pointerToMemberFunc)(first, second, third);
}
Run Code Online (Sandbox Code Playgroud)

以下是您将如何使用它的期望:

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
    .WillOnce(DoAll(
        InvokeUnrelatedFunction(my_obj, &MyClass::SomeAdditionalMethodIWantToCall,
                                arg1, arg2, arg3),
        Invoke(my_obj, &MyClass::DefaultBehavior),
        ));
Run Code Online (Sandbox Code Playgroud)


Myo*_*yon 6

如果您使用的是c ++ 11,则可以使用如下的lambda函数:

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
.WillOnce(DoAll(
    InvokeWithoutArgs([&]() { 
        my_obj->SomeAdditionalMethodIWantToCall(arg1, arg2, arg3); 
    },
    Invoke(my_obj, &DefaultBehavior)   
));
Run Code Online (Sandbox Code Playgroud)