理解使用GMock

2021-09-29 14:23:44 字數 3677 閱讀 4611

mock的定義:

在單元測試、模組的介面測試時,當乙個模組需要依賴另外乙個或幾個類,而這時所依賴的類還沒有開發好,這時就可以定義mock物件來模擬那些類的行為。也就是自己實現乙個假的依賴類,對這個類的方法想要什麼行為就可以有什麼行為,想讓這個方法返回什麼結果就可以返回什麼樣的結果。(便捷的模擬物件的方法。)

gmock 依賴c++多型機制進行工作,只有虛函式才能被mock, 非虛函式不能被mock, 這一點告訴我們,如果想要在**中使用gmock類的設計中,最好採用介面隔離,對於c++來說也就是採用純虛型別,因為c++本身沒有介面型別。

當乙個檔案中多個方法需要呼叫乙個未完成或者做單元測試時,就需要將這個未完成或者使用比較麻煩的虛方法mock,因為不希望為了執行單元測試,專門搭建乙個伺服器與***client互動,成本太高。注意:只需要mock這個被呼叫的虛方法,呼叫方法不需要mock,如果沒有返回值可以使用setargreferee<0>(),引數從0開始。

for example:

mock_method5(send, void(const string&,const string&,std::vector&,ncossresponse&,int));

std::vectorversions;

ncfileversioninfo info1;

info1.versionid = _t("1");

info1.filename = _t("zgh.txt");

info1.editorname = _t("zgh");

ncfileversioninfo info2 = info1;

versions.push_back (info1);

versions.push_back (info2);

// 構造http內容

json::array jarray;

for (size_t i = 0; i < versions.size (); ++i)

json::object json;

json.insert (make_pair (json_move (string ("versions")), json_move (jarray)));

string content;

content.reserve (64);

json::writer::write (json, content);

ncossresponse test;

test.body = content;

expect_call(*_clientmock, send(_, _, _, _, _))

.willonce(setargreferee<3>(test));

gmock的特性:

google mock是用來配合google test對c++專案做單元測試的。它依賴於googletest

輕鬆建立mock類,支援豐富的匹配器和行為,支援有序、無序、部分有序的期望行為的定義,多平台的支援

使用流程:

引入你要用到的gmock名稱。除巨集或其他特別提到的之外所有gmock名稱都位於testing命名空間之下,建立模擬物件(mock_object)

expect_call(mock_object,method(matcher1,matcher2,...))

.with(multi_argument_matcher)

.times(cardinality)

.insequence(sequences)

.after(expectations)

.willrepeatedly(action)

.retiresonsaturation();

expect_call 宣告乙個呼叫期待,就是我們期待這個物件的這個方法按照什麼樣的邏輯去執行。

mock_object      mock物件

method               mock物件中的mock方法,他的引數可以通過matchers規則去匹配

with                    多個引數的匹配方式指定

times                 表示這個方法可以被多次呼叫

insequence        指定函式執行的順序,他是通過同一序列中宣告期待的順序確定的

after                    指定某個方法只能在另乙個方法之後執行

willonce              表示執行一次方法時,將執行其引數action的方法,一般用return方法,用於指定一次呼叫的輸出

willrepeatedly     表示一直呼叫乙個方法時,將執行其引數action方法,需要注意他和willonce的區別,willonce時一次,willrepeatedly時一直。

retiresonsaturation   用於保證期待呼叫不會被相同的函式的期待所覆蓋

expect_call(mock_object,method(_,_))  表示有兩個引數

下劃線(_),它是萬用字元,就是對任何輸入引數都按之後要求執行

google mock的使用(例子):

class user

public:

virtual   user() {}

virtual  ~user()

public:

virtual   bool  login(const std::string& username,const std::string&  password) = 0; //登入

virtual   bool  pay(int money) = 0; //支付

virtual  bool  online() = 0; //是否登入

注意:析構函式必須虛函式,方法也的定義為純虛函式

業務模組:使用者登入,並且發起支付行為

class  biz

std::string  pay(const std::string& username,const std::string& password,int money)

if(!_user->online())

else

} else

if(!_user->pay(money))

else    

return ret;

}private:         

user*  _user;

};這段邏輯的口語描述就是:我們先看看使用者登入了沒,如果沒有登入則要求使用者登入。如果登入失敗,則直接返回;如果登入成功,則執行支付行為。最後將流程的狀態輸出。

class testuser :public user

punlic:

mock_method2(login,bool(const std::string&,const std::string&));

mock_method1(pay,bool(int));

mock_method0(online,bool());

mock_method #1(#2,#3(#4))

#1是要mock的方法有幾個引數

#2是要mock的方法名稱

#3是要mock的方法的返回值

#4是要mock的方法的具體引數

test(testuser , user)

int get()   

int value;

};class mocka : public a

;test(atest,getnum)

int main(int argc,char *ar**)

gmock學習01 Linux配置gmock

本文目的 本文主要介紹gmock 1.6.0版本在linux上如何部署和使用。gmock是做什麼的?使用c 手動編寫mock物件將會是一件十分耗時,易於出錯,枯燥乏味的事情。gmock提供一整套mock 框架,幫助你完成這些髒活累活。編譯gmock 2上傳 使用winscp或其他工具將gmock 1...

gmock學習03 自定義輸出引數

使用gmock時,有時候需要向被mock的函式輸入一些自定以引數,用來測試呼叫mock的方法的各種的執 況。前幾天在專案中遇到這個問題,並使用了該技巧,覺得很有用,所以總結出來,作為備忘。class client 內部有個函式query 用於執行查詢操作。查詢的響應物件通過引用的方式傳回給呼叫物件,...

C 單元測試框架 gtest 5 gmock

google mock 簡稱 gmock 是google在2008年推出的一套針對c 的 mock框架,它靈感取自於 jmock easymock harcreat。google mock是用來配合 google test 對c 專案做單元測試的。它依賴於 googletest。當你寫乙個原型或是測...