谷歌模拟 - 如何EXPECT_CALL变量名称,即标识符

时间:2017-05-22 15:13:42

标签: c++ googletest googlemock

我有一个我需要检测的函数,即

EXPECT_CALL(MockClass_obj, target_func());

签名是:

void MockClass::target_func(HANDLE_t handle);

参数handle是一个不透明的类型,它在某个其他函数中是一个全局集,所以是的,我需要将其存根。

问题在于:在我测试的函数内部,我根据所采用的分支调用MockClass::target_func几个不同的参数:

//MockClass inherits Class, call f1() with instance of MockClass
void f1(int a, Class & obj)
{
    switch(a):
    {
    case 0:
        obj.target_func(global_handle_1);
        break;
    case 1:
        obj.target_func(global_handle_2);
        break;
    default:
        obj.target_func(global_handle_3);

    }
}

问题

如何根据参数的NAME进行期望调用?我需要检测哪条路径。

由于所有global_handle_[x]变量都将被删除,即设置为任意值,我可以将它们设置为global_handle_<x>=<x>然后EXPECT_CALL(MockClass_obj, target_func(<x>));

我认为这样做还不错,但要更强大,理想情况下我想在变量名称上使用EXPECT_CALL吗?

这可能吗?

1 个答案:

答案 0 :(得分:2)

使用C ++基本上无法满足您的要求。 target_func按值传递其参数,因此无法知道该值是如何计算的(或其模拟版本)。调用可以是obj.target_func(global_handle_1);,也可以是obj.target_func(global_handle_2 - 1);(如果这些表达式碰巧具有相同的值)。

我认为您最好的选择是为每个全局变量赋予唯一值,然后EXPECT正确的值。我会a)将独特的价值空间分开; b)依靠代码审查来发现人们对句柄值进行算术运算。

如果target_fun通过引用获取了它的参数,那么可能能够根据引用的地址执行EXPECT - 但我不会& #39;打扰。