幾個月前Google開源了其C++測試框架,現在Google又基於BSD協議將其C++ Mocking框架Google Mock開源。
在Google內部Google Mock被用在100多個項目中,根據Google軟件工程師Zhanyong Wan所說,Google Mock的靈感來自於jMock和EasyMock。該框架可用在Linux、Windows及Mac OS X上,面向C++開發者。Zhanyong給出了一個mocking的例子:
class TaxServer { // Returns the tax rate of a location (by postal code) or -1 on error.
virtual double FetchTaxRate(
const string& postal_code) = 0;
virtual void CloseConnection() = 0;
};
class MockTaxServer : public TaxServer { // #1
MOCK_METHOD1(FetchTaxRate, double(const string&));
MOCK_METHOD0(CloseConnection, void());
};
TEST(ShoppingCartTest, StillCallsCloseIfServerErrorOccurs) {
MockTaxServer mock_taxserver; // #2
EXPECT_CALL(mock_taxserver, FetchTaxRate(_)).
WillOnce(Return(-1)); // #3
EXPECT_CALL(mock_taxserver, CloseConnection());
ShoppingCart cart(&mock_taxserver); // #4
cart.CalculateTax(); // Calls FetchTaxRate()
// and CloseConnection().
} // #5
從接口派生出mock類。對於每個虛方法,計算它的參數個數、名字和結果n,然後使用MOCK_METHODn進行定義,其參數就是方法的名字和類型。
創建該mock類的一個實例。當你使用真實對象時,實際使用的就是該mock對象。
設置該mock對象的期望(是否會被使用?將要做什麼?)。例如,第一個EXPECT_CALL表示會調用FetchTaxRate()並返回一個錯誤。underscore (_)是一個匹配器(matcher),表示參數可以是任何值。Google Mock有很多可用的匹配器,你可以使用他們精確指定參數是什麼。你還可以定義自己的匹配器或者使用一個確定的值。
使用mock對象的測試代碼。如果某個mock方法的調用次數超過了期望值或是參數不正確你就會立刻看到一個錯誤。
當mock對象銷燬時,系統會檢查其上的期望是否都滿足了。
這裏是一些有用的鏈接:Google Mock主頁、完整的文檔及二進制下載。Google Mock for Dummies是對Google Mock的一個快速介紹,它還包含一些例子和說明。