【问题标题】:c++ gmock invoke other function with same argsc ++ gmock调用具有相同参数的其他函数
【发布时间】:2015-11-02 09:34:50
【问题描述】:

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

    bool func1(vector<string> data)

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

【问题讨论】:

  • 1.你试过什么了? 2. 使用该签名,您的函数将填写data副本,而不是dataitself。

标签: c++ unit-testing googletest googlemock


【解决方案1】:

您没有指定这是成员函数还是全局函数。由于您想在 C++ 模拟框架中模拟它,我会假设它是。此外,正如安东尼奥所说,如果您想修改向量,您必须更改函数的签名并使用引用传递data。因此,如果func1MyClass 类中的成员,您需要执行以下操作。

创建一个接口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 是一个全局函数,您可以通过定义一个小接口并在生产代码中通过该接口调用它来使用相同的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多