11

我在我的项目中使用 gmock 并且遇到了为模拟函数设置自定义引用变量的问题。假设我有一个类如下:

class XXXClient {
public:
    void QueryXXX(const Request&, Response&);
}; 

class XXXRunner {
public:
    void DoSomething(XXXClient&);
};

有一个使用 XXXClient::QueryXXX 的客户端类 XXXRunner::DoSomething,我想模拟 XXXClient 来测试 XXXRunner::DoSomething。

问题是 QueryXXX 的第二个参数 'Response' 不是返回值,而是引用变量,我在 XXXClient::QueryXXX 的 Response 中填充了一些数据。我想为响应设置一个自定义数据来验证 XXXRunner::DoSomething 的不同条件。

gmock 框架可以设置预期的返回值,但我找不到设置“返回变量”的方法?

那么该怎么做呢?

4

2 回答 2

19

首先,制作一个XXXClient模拟类,我们将其命名XXXClientMock如下:

class XXXClientMock : public XXXClient
{
public:
    MOCK_METHOD2(QueryXXX, QueryResult (Request&, Response&));
};

然后,使用 GMock ActionSetArgReferee设置自定义参数,如下:

TEST(XXXRunnerTC, SetArgRefereeDemo)
{
    XXXCLientMock oMock;

    // set the custom response object
    Response oRsp;
    oRsp.attr1 = “…”;
    oRsp.attr2 = “any thing you like”;

    // associate the oRsp with mock object QueryXXX function
    EXPECT_CALL(oMock,  QueryXXX(_, _)).
        WillOnce(SetArgReferee<1>(oRsp));
    // OK all done

    // call QueryXXX
    XXXRunner oRunner;
    QueryResult oRst = oRunner.DoSomething(oMock);
    …

    // use assertions to verity your expectation
    EXPECT_EQ(“abcdefg”, oRst.attr1);
    ……
}

总结
GMock 提供了一系列动作来方便地模拟函数,例如SetArgReferee引用或值,SetArgPointee指针,Return返回,Invoke调用自定义模拟函数(带有简单的测试逻辑),您可以在这里查看更多详细信息。

享受它:)谢谢

于 2012-01-24T13:27:31.970 回答
2

查看SetArgRefereeGoogle Mock备忘单中的。

于 2012-01-13T16:05:11.847 回答