数カ月前にC++テストフレームワークをオープンソースにした(参考記事)後、GoogleはBSDライセンス(リンク)のもと、Google C++モッキングフレームワーク(Google Mock)(リンク)をオープンソースにした。
GoogleのソフトウェアエンジニアであるZhanyong Wan氏によると、Google MockはGoogleの100を超えるプロジェクトで使用されており、jMock(リンク)およびEasyMock(リンク)によって着想させられている。そのフレームワークは、Linux、WindowsまたはMac OS Xで使用可能であり、C++デベロッパを取り扱う。Zhanyong氏は、モックの例(リンク)を以下のように示している。
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
インターフェイスからモッククラスを導き出す。それぞれの仮想メソッドで、いくつ引数があるか数え、結果 nを命名し、引数がメソッドの名前や型であるMOCK_METHODnを使用してそれを定義する。
モッククラスのインスタンスを作成する。通常実オブジェクトを使用するようなことろで使用される。
モックオブジェクトに対する期待を定める(どう使用されるか?何をするのか?)。たとえば、最初のEXPECT_CALLは、FetchTaxRate() が呼び出され、エラーを返すと書いてある。下線 (_) は、引数は何でもなり得るmatcherであると書いてある。GoogleのMockには、引数がどうあるべきか正確に指定するために使用できる、多くの matcherがある。また、独自のmatcherを定義したり、正確な値を使用することができる。
モックオブジェクトを使用するコードを用いる。モックメソッドが予想以上の回数呼び出されたり、誤った引数で呼び出された場合、すぐさまエラーになる。
モックオブジェクトが破壊されると、すべての期待が満たされていることを確認する。
役立つリンク:ホームページ(リンク)。完全な文書(リンク)。バイナリダウンロード(リンク)。Google Mock for Dummies(リンク)は、例や説明を交えながら、Google Mockの概要を簡潔にまとめたものである。