Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用谷歌C++模拟框架(谷歌模拟)将任意参数传递给被调用的方法(V1.5)_C++_Unit Testing_Parameters_Mocking_Googlemock - Fatal编程技术网

用谷歌C++模拟框架(谷歌模拟)将任意参数传递给被调用的方法(V1.5)

用谷歌C++模拟框架(谷歌模拟)将任意参数传递给被调用的方法(V1.5),c++,unit-testing,parameters,mocking,googlemock,C++,Unit Testing,Parameters,Mocking,Googlemock,我有一个模拟的方法。当它被调用时,我希望它在调用其正常行为之前调用另一个函数。比如: EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) .WillOnce(DoAll( Invoke(my_obj, &SomeAdditionalMethodIWantToCall), Invoke(my_obj, &DefaultBehavior), )); 唯一的问题是,SomeAdditi

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

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),
        ));
我在文档中寻找过这样的东西,但没有成功

在这方面,我们有:

Invokef、Invokeobject_pointer、&class::method、InvokeWithoutArgsf、InvokeWithoutArgsobject_pointer、&class::method在调用模拟函数时,将只转发或不转发提供给模拟函数的参数

InvokeArgumentarg1,arg2,…,argk似乎用于调用其中一个参数

WithArga和WithArgsa似乎要从原始函数中选择要转发的参数。
我想我遗漏了一些非常明显的东西,但我有点被困在这里,所以任何建议都会有所帮助。

一个可能的选择是使用Assign操作将参数的值保存到类变量中,然后使用helper调用另一个函数。使用以下期望值:

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),
        ));
EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
    .WillOnce(DoAll(
        InvokeUnrelatedFunction(my_obj, &MyClass::SomeAdditionalMethodIWantToCall,
                                arg1, arg2, arg3),
        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(
        Assign(&classVariable1, arg1),
        Assign(&classVariable2, arg2),
        Assign(&classVariable3, arg3),
        InvokeWithoutArgs(my_obj, &MyClass::SomeAdditionalMethodIWantToCallHelper),
        Invoke(my_obj, &MyClass::DefaultBehavior),
        ));
EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_))
    .WillOnce(DoAll(
        InvokeUnrelatedFunction(my_obj, &MyClass::SomeAdditionalMethodIWantToCall,
                                arg1, arg2, arg3),
        Invoke(my_obj, &MyClass::DefaultBehavior),
        ));

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

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

对于InvokeUnrelatedFunction操作,我得到的只是一个编译器错误,表示arg1未在我尝试调用该操作的位置声明。原因可能是什么?@Martin如问题中所述,arg1是一个与提供给MockedMethod的参数无关的参数。如果要将参数从MockedMethod传递给函数,可以使用Invoke。如果需要,还可以将Invoke与withargs结合使用。请参考谷歌模拟烹饪书的例子。我的编译器说一些返回值是required@ChristopherPisz您可能需要添加Return子句。例如:EXPECT\u CALL….willoncedallinvoke…,ReturnsomeValue;是的,返回值用于mock方法。但是,我需要在模拟方法返回后进行调用。:/我看不出有什么办法。非常优雅!谢谢。什么方法是私人的?