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

时间:2015-01-15 12:35:36

标签: c++ unit-testing parameters mocking googlemock

我有一个模拟方法。当它被调用时,我希望它在调用其正常行为之前调用另一个函数。类似的东西:

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
    .WillOnce(DoAll(
        Invoke(my_obj, &SomeAdditionalMethodIWantToCall),
        Invoke(my_obj, &DefaultBehavior),
        ));

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

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
    .WillOnce(DoAll(
        Invoke(my_obj, &SomeAdditionalMethodIWantToCall, arg1, arg2, arg3),
        Invoke(my_obj, &DefaultBehavior),
        ));

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

Using a Function or a Functor as an Action中,我们有:

  • Invoke(f)Invoke(object_pointer, &class::method)InvokeWithoutArgs(f)InvokeWithoutArgs(object_pointer, &class::method)只会转发(或不转发)调用时提供给模拟函数的参数。< / p>

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

Composite Actions

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

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

2 个答案:

答案 0 :(得分: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),
        ));

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

void MyClass::SomeAdditionalMethodIWantToCallHelper()
{
    SomeAdditionalMethodIWantToCall(classVariable1, classVariable2, classVariable3);
}

修改

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

ACTION_P5(InvokeUnrelatedFunction, classPointer, pointerToMemberFunc,
          first, second, third)
{
    (classPointer->*pointerToMemberFunc)(first, second, third);
}

以下是您如何在期望中使用它:

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

答案 1 :(得分:6)

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

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