web-dev-qa-db-ja.com

PowerMock、EasyMock、Mockitoフレームワークの違いは何ですか?

私はフレームワークのモック作成は非常に新しいので、ユニットテストを完了するにはフレームワークのモック作成が必要です。現在のコードベースでは、上記の3つのフレームワークがユニットテストのために異なる場所で使用されていることがわかります。それで、上記の3つのフレームワークのうち、どれを選べばいいですか?

15
keya

他の人はおそらく気に入らないだろうと説明しますが、私(および私が言及した多くの人)は非常に役立つと思います/見つけました:PowerMockはモックフレームワークです...

PowerMockの主なadvantageは、EasyMockができる特定の構造(たとえばstaticメソッド呼び出し)をテストするために使用できることですtモック。したがって、変更できないサードパーティのコードをテストする場合。静的呼び出しが含まれています。次に、PowerMockを使用します。

ただし、独自のコードを記述し、 テスト可能なコードの記述 ;に集中する場合「PowerMockを使用する必要性」は、「コードを設計するのに悪い仕事をした」とまったく同じであることがわかります。たとえば、staticを直接使用すると、クラス間で直接結合になります。したがって、ハードになったら、それを取り除くのは難しい.

誤解しないでください-PowerMockはテストに適しています。しかし、その強力な機能には一定のコストがかかります。

EasyMock/Mockitoの場合:主にテストケースを書き留める「2つの異なる方法」。後者は、多くの人が読みやすいと感じるテストにつながります。一方、EasyMockと「厳格な」モックを使用すると、プロダクションコードのほとんどの変更(それ自体が非常に便利な、または非常に迷惑な場合があります)ですぐに壊れるテストケースを書き留めることができます。

32
GhostCat

ここ MockitoとEasyMockの比較を見つけることができます:

違い

  • 記録/再生モードはありません-それらの必要はありません。 Mockitoモックでできることは、確認またはスタブの2つだけです。スタブは実行前に実行され、その後検証されます。

  • すべてのモックはニースです(コレクションを返すメソッドがnullではなく空のコレクションを返すため、多少なりとも優れています)。モックはニースですが、必要に応じて厳密に検証し、不要な相互作用を検出できます。

  • 読みやすくするための明示的な言語:verify()およびwhen()VS expect(mock.foo())とmock.foo()の混合(expectなしのプレーンなメソッド呼び出し)。この議論は主観的だと思う人もいると思います:)

  • 簡略化されたスタブモデル-スタブメソッドは、呼び出された回数に関係なく、常にスタブ値で再生されます。 EasyMockのandStubReturn()およびandStubThrow()とまったく同じように機能します。また、(EasyMockのように)異なる引数に対して異なる戻り値を使用してスタブすることができます。

  • 通常、スタブ化された値がどこから来たのかではなく、正しく使用されているかどうかをテストすることがより重要であるため、スタブ化されたメソッドの検証はオプションです。

  • 検証は明示的です-検証エラーは、どの対話が失敗したかを示すコード行を指します。

  • 順序の検証は柔軟であり、すべての相互作用を検証する必要はありません。

  • カスタム引数マッチャーはハムクレストマッチャーを使用するため、既存のハムクレストマッチャーを使用できます。 (EasyMockはHamcrestと統合することもできますが、EasyMockの一部ではなく、Hamcrestです。Hamcrestのドキュメントを参照してください)。

PowerMockは、MockitoやEasyMockなどの他のMockingフレームワークの拡張機能であり、より強力な機能が付属しています。つまり、Mockito/EasyMockとPowerMockを同じユニットテストに組み合わせることができます。

私は個人的にコードの大部分をユニットテストするためにMockitoを使用し、PowerMockは静的メソッドのテストとして追加機能を必要とするコードでのみ使用します。

4
Julieta

デザインを管理していて、Mockitoでほとんど問題ないはずです。たとえば、PowerMockを使用すると、格好良いプライベートメンバーをモックできますが、そのプライベートメンバーを依存性注入によって提供されたパラメーターにリファクタリングする場合は不要です。

2
Florin Grigoriu