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。當你寫乙個原型或是測...