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)似乎是选择转发原始函数中的哪些参数.我想我错过了一些非常明显的东西,但我有点卡在这里,所以任何建议都会有所帮助.
一种可能的选择是使用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)
如果您使用的是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)
| 归档时间: |
|
| 查看次数: |
8742 次 |
| 最近记录: |