c ++ gmock使用相同的args调用其他函数

时间:2015-11-02 09:34:51

标签: c++ unit-testing googletest googlemock

我想为这个函数创建一个模拟器:

    bool func1(vector<string> data)

真实函数应填充向量,如果成功则返回true 我的模拟也应该用向量填充向量并返回true。我怎么能用gmock来做呢?

1 个答案:

答案 0 :(得分:1)

您尚未指定这是成员函数还是全局函数。既然你想在C ++模拟框架中模拟它,我会认为它是。另外,正如Antonio所说,如果要修改向量,则必须更改函数的签名并使用引用传递data。因此,如果func1是班级MyClass中的成员,则您需要执行以下操作。

创建一个接口IMyClass并让您的类实现该接口:

class IMyClass
{
public:
    virtual IMyClass() {}
    virtual bool func1(vector<string> &data) = 0;
}

class MyClass : public IMyClass
{
    bool func1(vector<string> &data) override
    {
        // Your code that modifies 'data'
    }
}

然后,创建一个使用gmock实现此接​​口的模拟类:

class MyClassMock : public IMyClass
{
public:
    MOCK_METHOD1(func1, bool(vector<string> &));
}

最后,在测试中,您可以模拟对此函数的调用。假设您要模拟调用,将两个字符串("str1""str2")设置为向量data。这就是你在测试体中所做的事情:

vector<string> dummyData = { string("str1"), string("str2") };
MyClassMock mockObj;
EXPECT_CALL(mockObj, func1(_))
    .WillOnce(DoAll(SetArgReferee<0>(dummyData), Return(true)));

如果func1是一个全局函数,您可以通过定义一个小接口并通过生产代码中的该接口调用它来使用相同的方法。