フェルマータ

個人用のメモ。ソフトウェアの導入とかが多くなる予定。

Google Mock で演算子オーバーロードしたクラスのモックを作る。

経緯

 以前書いた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