我有一个模拟方法。当它被调用时,我希望它在调用其正常行为之前调用另一个函数。类似的东西:
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)
似乎是为了调用其中一个参数。
WithArg<N>(a)
和WithArgs<N1, N2, ..., Nk>(a)
似乎是要选择转发原始函数中的哪些参数。我想我错过了一些非常明显的东西,但我有点卡在这里,所以任何建议都会有所帮助。
答案 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)
));