フェルマータ

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

Google Mock で参照を返す。

経緯

 つい先程テストを書いていて、参照を返すタイプのメソッドをモッキングする際に失敗をしたのでメモしておく。

問題

 こんな感じのクラスをモック化しようとする。

class MyClass
{
public:
    virtual ~MyClass(){ }
    virtual const Property &property() const;
};

当然以下のようにモックを作る。

class MockMyClass : public MyClass
{
public:
    MOCK_CONST_METHOD0(proeprty, const Property &());
}

そして以下のようにモックを定義する。

MockMyClass mock;
Property retval;
EXPECT_CALL(mock, property())
    .Times(1)
    .WillOnce(Return(retval));

一見うまく行きそうなのだが以下のようなエラーに遭遇する。

gmock/include/gmock/gmock-actions.h:498:5: error: size of array is negative
     GTEST_COMPILE_ASSERT_(!internal::is_reference<Result>::value,
     ^

 C++コンパイルエラーはなかなか趣深いが何を言っているか分からなくて困る。Google 先生に聞いてみたら以下の解決策を見つけた。

解決策

 参照を返すには ReturnRef を使えばよいらしい。以下のようにして解決。

MockMyClass mock;
Property reval;
EXPECT_CALL(mock, property())
    .Times(1)
    .WillOnce(ReturnRef(retval));

参考資料

https://groups.google.com/forum/#!topic/googlemock/UM6dgKz3rQQ