4

与えられたインターフェース

class IFooable {
  virtual void Fooable() = 0;
};

class IFoo {
  virtual void Foo(IFooable* pFooable) = 0;
};

そしてグールモックモック

class TMockFoo : public IFoo {
  MOCK_METHOD1(Foo, void (IFooable*));
};

Fooable()モックされたメソッドの引数を呼び出すアクションを指定する最も簡単な方法は何Foo()ですか?

私が試してみました

TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WithArg<0>(Invoke(&IFooable::Fooable));

しかし、これはコンパイルされません。これはInvoke()、引数が 1 つの場合、メンバー関数ではなく、自由な関数が必要になるためです。

を使用boost::bindするとおそらくうまくいくはずですが、必ずしもコードが読みやすくなるとは限りません。custom を書く前にAction、完全に明らかな何かを見逃していないかどうかを確認したかったのです。

4

3 に答える 3

1

Google Mockがインストールされていないため、テストできませんがInvoke、オブジェクトとメソッドポインターの2つのパラメーターで別のオーバーロードがあるようです。したがって、次のようになります。

IFooable* ifooable = new IFooableImpl(...);
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WithArg<0>(Invoke(&ifooable,&IFooable::Fooable));
于 2011-08-23T12:19:14.390 に答える
1

簡単な方法を見つけることができず、最終的に解決しました

TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WillByDefault(Invoke(boost::mem_fn(&IFooable::Fooable)));
于 2011-08-26T10:24:50.353 に答える
0

メンバー関数を呼び出す最も簡単な方法は、ラムダを使用することです。

   TMockFoo MockFoo;
   ON_CALL(MockFoo, Foo(_))
      .WithArg<0>(Invoke([](IFooable * pFooable) { pFooable->Fooable(); }));
于 2018-04-23T18:03:57.453 に答える