1

単体テストで Google モック ライブラリを使用していますが、失敗する可能性のあるカスタム チェックを実行しようとしています。

次の例は、私がやろうとしていることを示しています:

struct Base
{
};
struct Derived : Base
{
  int a;
};

struct MockClass
{
  MOCK_METHOD1( Send, void ( Base & ) );
};

ここで、偽のオブジェクトが Send メソッドで Derived 型のオブジェクトと値 a を渡されたかどうかを確認したいと思います。それで、それを行う方法は?

私の考えは、Invoke を使用して、base から Derived に dynamic_cast する関数への呼び出しを転送し、値を確認することです。型が予期されていない場合は、例外をスローします。このような :

void TestCall( Base &obj )
{
  Derived *realObj = dynamic_cast< Derived * >( &obj );
  if ( NULL == realObj )
  {
    throw 123;
  }
}

次に、次のようにテストします。

MockClass mockObj;
EXPECT_CALL( mockObj, Send(_) )
  .WillOnce( Invoke( &TestCall ) );

これはうまくいきますか?それとももっと良い方法がありますか?

4

1 に答える 1

6

カスタムマッチャーを定義して、引数の型と値を同時に検証できます。

MATCHER_P(IsDerivedAnEqual, a, "") {
  Derived* derived_arg = dynamic_cast<Derived*>(&arg);
  return derived_arg != NULL && derived_arg->a == a;
}

EXPECT_CALL(mock_obj, Send(IsDerivedAndEqual(5));

複合マッチャーを使用して、より複雑な条件を構築することもできます。

WillOnce()式に入れる呼び出しはアクションです。それらは、呼び出しが設定した期待に一致する場合にのみ呼び出され、呼び出された場合に外部依存関係が行うことを模倣することになっています。それらを使用して期待を設定しても機能しません。

于 2011-03-21T20:56:10.217 に答える