如何在gmock中设置自定义ref-variable

时间:2012-01-13 03:59:41

标签: gmock

我在我的项目中使用gmock,我遇到了为mock函数设置自定义引用变量的问题。 假设我有一个如下课程:

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

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

使用XXXClient :: QueryXXX有一个Client Class XXXRunner :: DoSomething,我想模拟XXXClient来测试XXXRunner :: DoSomething。

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

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

那怎么办?

2 个答案:

答案 0 :(得分:17)

首先,创建一个XXXClient模拟类,让它命名为XXXClientMock如下:

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

然后,使用GMock Action SetArgReferee设置自定义参数,如下所示:

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用于调用自定义模拟函数(使用简单的测试逻辑),您可以查看here以获取更多详细信息。

享受它:) 谢谢

答案 1 :(得分:2)

查看Google模拟cheat sheet中的SetArgReferee