2012-01-13 212 views
10

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

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

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

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

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

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

那么该怎么做?

回答

16

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

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

然后,使用GMock行动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了解更多细节。

享受它:) 谢谢

相关问题