web-dev-qa-db-ja.com

Google Mockは優れたモックフレームワークですか?

私は会社で単体テストの先駆者であり、使用するモックフレームワークを選択する必要があります。モックフレームワークを使用したことはありません。既にGoogle Testを選択しているので、Google Mockを使用するのがいいでしょう。ただし、 Google Mockのチュートリアル を見た後の私の最初の印象は次のとおりです。

  • MOCK_METHODnマクロを使用してモッククラスの各メソッドを再宣言する必要は不要に思われ、DRY原則に反するようです。
  • それらのマッチャー(たとえば、EXPECT_CALL(turtle、Forward(_));の「_」)およびマッチングの順序はほとんど強力すぎるようです。同様に、あなたが意味しないことを言うのは簡単であり、そのようにバグを見逃します。

私はグーグルの開発者に高い自信を持っています。また、モックフレームワークを判断する自分自身の能力には自信がありません。だから私の質問は:これらの有効な懸念はありますか?

それとも、モックオブジェクトを定義するより良い方法はありませんか?実際にマッチャーは直感的に使用できますか?以前にGoogle Mockを使用したことがある人からの回答をいただければ幸いです。他のC++フレームワークとの比較が役立つでしょう。

61
des4maisons

頻繁に使用します。

比較的簡単なことをするのは簡単ですが、非常に難しいことをすることは可能です-それはフレームワークに欲しいものです。

Googleのモックを使用してカスタムマッチャー(およびその他のもの)を作成することの最も難しい部分は、Googleのモックではなく、C++のテンプレートエラーです...解析するのはほぼ不可能です。私は、いくつかのそれほど複雑でない式から作業式を段階的に構築して、複雑な式を書くことがよくあります。そうすれば、テンプレートエラーを簡単に特定できます。

私はC++のモックを作成するためのより良いオプションを見たことはありませんし、Googleの多くの領域をカバーしているので、試してみることをお勧めします。

WRT the DRY原則、モックされたメソッドを宣言することは残念ですが、反省することなく、c ++がそれ以外に幸運があるかどうかはわかりません。 、googlemockはそれを使用します;)

ところで: googlemock cookbook は良いリファレンスです。

43
Stephen

Fake-It は、C++用のシンプルなモックフレームワークです。 FakeItは最新のC++ 11機能を使用して、表現力豊かな(非常にシンプルな)APIを作成します。 FakeItでは、メソッドを再宣言したり、各モックの派生クラスを作成したりする必要はありません。偽造方法は次のとおりです。

struct SomeInterface {
  virtual int foo(int) = 0;
};

// That's all you have to do to create a mock.
Mock<SomeInterface> mock; 

// Stub method mock.foo(any argument) to return 1.
When(Method(mock,foo)).Return(1);

// Fetch the SomeInterface instance from the mock.
SomeInterface &i = mock.get();

// Will print "1"
cout << i.foo(10);

さらに多くの機能を探索する必要があります。先に進み、 試してみてください

20
Eran Pe'er

免責事項:HippoMocksを書きました。

他のモックフレームワークを見ることをお勧めします。自分自身を繰り返さないクラスがあります。また、一致するための新しい構文を廃止して、コードを英語と組み合わせたC++のように読みやすくします。試してみる!

http://www.assembla.com/wiki/show/hippomocks

14
dascandy

私はgoogletest + googlemockを数年間専門的に使用していますが、間違いなく気に入っています。他の人から言及されていないことの1つは、googletestの使用に既にコミットしている場合は、googlemockも使用することは理にかなっているということです。それらはかなりよく統合されており、似たようなデザインスタイルと哲学を共有しています。それがニースです。

たとえば、googlemockはASSERT_THAT()マクロを提供します。これは非常に便利で、googletestsのアサーションとうまく共存します。

ただし、googlemockのパワーを乱用することについては警告します。 extremely非常に複雑で強力なマッチャーを作成して、まったく読めないようにしたい場合があります。あなたはそれを使用するときに規律する必要があります。

他の考え:

  • Googlemockは、やや急な学習曲線を持つことができます。マッチャーと期待の複雑さは、期待するほど単純ではありません。
  • DRYに違反することに対する懸念は有効です。簡単に自動生成できると思われる場合は、手動でモックを定義する必要があり、面倒です。インターフェースのgooglemocksを定義します。
6
Ian