経緯
以前書いたGoogle Mock を導入してみた。に見るように 普通の仮想メンバ関数のモッキングは大変簡単なのだが、演算子のオーバーロードに対してはモッキングができないのかやり方を調べてみた。
問題
単純に仮想関数をモッキングするだけであれば、MOCK_METHOD*を書けば良いだけなのだが以下の様なコードは許容されなかった。
どうやら単純にはできないらしい。
class MyList
{
public:
virtual ~MyList(){ }
virtual MyElement &operator[](int index) = 0;
};
class MockedMyList : public MyList
{
public:
MOCK_METHOD1(operator[], MyElement &(int index)); // こう書くことはできない。
};
解決法
operator[] はオーバーライドし、モッキングしたメンバ関数に処理を委譲すれば良い。
すなわち以下のように定義する。
class MockedMyList : public MyList
{
public:
MOCK_METHOD1(subscript, MyElement &(int index));
MyElement &operator[](int index)
{
return subscript(index);
}
};
あとはsubscriptの動作を定義すれば良い。
参考資料
http://stackoverflow.com/questions/6492664/how-to-create-a-mock-class-with-operator