2012-01-13 210 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瞭解更多細節。

享受它:) 謝謝

相關問題