2016-10-11 20 views
1

抽象クラスをモックしようとしていますが、GMockヘッダーの内部からエラーをコンパイルしています。私は実際のコードを共有することはできませんが、ほぼ同じです。 mockingは正常に動作していましたが、オブジェクトを参照するために "DoStuff"関数を変更しなければなりませんでした。それ以来、それはコンパイルされません。エラーは次のようなものです* GMockは "Element"とlong long *を比較できません。GMockはコンパイルされません。ユーザー型参照引数付きの仮想関数

"C++ code" 

using ::testing::NiceMock; 

class Element{}; 

class Foo 
{ 
    public: 
     virtual void DoStuff(Element&) = 0; 
}; 

class MockFoo : public Foo 
{ 
    public: 
     MockFoo() {}; 
     MOCK_METHOD1(DoStuff, void(Element&)); 

}; 

TEST(example, test) 
{ 
    NiceMock<MockFoo> mf; 
    Element element{}; 
    EXPECT_CALL(mf, DoStuff(element)).Times(1); 

    mf.DoStuff(element); 
} 

答えて

1

generic comparisons matchersをご覧ください。

あなたが嘲笑オブジェクトにまったく同じ要素がmf.DoStuffを経由して渡されたチェックしたい場合は

- ::testing::Refマッチャーを使用します。

EXPECT_CALL(mf, DoStuff(Ref(element))); 

(注:タイムズ(1)デフォルトであること - そう、本当に必要はありません)。

あなたは、渡されたオブジェクトがまったく同じ値を持っているかどうかを確認したい場合は - それのための比較演算子を定義する - あるいは、いくつかの適切な照合を使用する - ::testing::Propertyのように - のような:

EXPECT_CALL(mf, DoStuff(AllOf(Property(&Example::getX, expectedXValue), 
           Property(&Example::getY, expectedYValue)))); 

私はあなたのためにあなたの正確な問題があると思います実際のExampleクラスは抽象クラスで、operator ==がないため、デフォルトマッチャー::testing::Eqは使用できません。

+0

クイック返信をいただきありがとうございます。正確な「要素」は必要ありません。関数が呼び出されているかどうかをテストする必要があります。しかし、もう一度感謝、私はあなたの提案を試みるつもりです。 –

+1

'testing :: _'というマッチャーは、 'EXPECT_CALL(mf、DoStuff(_));が必要な場合に使用します; – PiotrNycz

+0

ありがとうございました! –

関連する問題