web-dev-qa-db-ja.com

PowerMock + Mockito VS Mockito単独

誰でも要約してください、PowerMockをMockitoの上に追加することができる正確な機能は何ですか?

これまでのところ、私はこれらを見つけました:

  • 静的メソッド、最終メソッド、プライベートメソッドのモック
  • 静的初期化子を削除する
  • 依存性注入なしでモックを許可します-これは私には明らかではありません。詳しく説明してもらえますか?

他に何か追加しますか?いくつかの行に要約していただけますか?

PowerMockを使用するときに何かを犠牲にする必要がありますか?

50

他の利点を知っているわけではありませんが、2つのサブ質問に対処したいと思います(これはコメントするには長すぎます)。

依存性注入なしでモックを許可します-これは私には明らかではありません。詳しく説明してもらえますか?

これは 動機wikiページ から来たと思います。そこでは、静的メソッドを呼び出してテスト可能にしないようにコードをリファクタリングする方法を説明しています。私が彼らが得ていると思うものの具体例については、このコードがあり、powermockを使用せずに静的メソッドの動作を模擬するメソッドをテストしたいとしましょう:

public class MyClass {
     public void doGetString() {
         ...
         OtherClass.getString(); //It's complex and scary and needs mocking!
         ...
     }
}

1つの解決策は、静的呼び出しを独自のオブジェクトにプルし、テスト時にモックできるオブジェクトを注入することです。たとえば、他のフレームワークを使用しない場合、これは次のようになります。

public class MyClass {
     public static class StringGetter {
         public getString() {
             return OtherClass.getString();                 
         }
     }

     private final StringGetter getter;

     //Existing Constructor
     public MyClass() {
         this(new StringGetter());
     }

     //DI Constructor
     MyClass(StringGetter getter) {
         this.getter = getter;
     }

     public void doGetString() {
         ...
         getter.getString();
         ...
     }
}

メソッドの振る舞いを静的呼び出しの振る舞いから分離し、DIコンストラクターを使用して、テスト時にモックを簡単に注入できます。もちろん、powermockを使用すると、静的メソッドを所定の場所でモックし、それで実行できます。

PowerMockを使用するときに何かを犠牲にする必要がありますか?

物理的にはありませんが、哲学的にはそうです:)。以下は私の意見であり、私はそれらの背後にある正当な理由を与えようとしますが、もちろん彼らは意見なので、一粒の塩でそれらを取ります:

PowerMockで発生する可能性のある恐ろしいことは、プライベートメソッドと静的メソッドをモックするという偉業を達成するために、カスタムクラスローダー(実稼働では実行時に存在しない)を使用し、クラスのバイトコードを変更することです。ほぼ間違いなく、ほとんどの場合、これはクラスの大部分とは関係ありませんが、考えてみると、バイトコードが変更され、特定の副作用がもはや存在しない場合、実際に基づいて異なるクラスを効果的にテストしています既存のクラス。はい、これは非常に学術的な議論です。

優れた包括的統合とPowerMockを使用しない高レベルのテストを行うことにより、この最初の議論を多少軽減できます。このようにして、単体テストでPowerMockを使用している場合でも、オブジェクトの動作により自信を持つことができます。

PowerMockに対するもう1つの議論は、松葉杖になりやすいということです。私は、PowerMockがレガシーコードや他のコードを制御できないコードを使用するコードのテストに役立つことに同意します。ただし、モックする必要があるクラスを制御できる場合は、その使用を避ける必要があると主張します。他のメソッドをテストするために明示的にモックする必要があるプライベートメソッドまたは静的メソッドでクラスを作成する場合、私の直感は、このメソッドが多すぎてリファクタリングして分割する必要があると言うでしょう。プロジェクトでPowerMockが既に利用可能になっている場合、単にそれをモックして先へ進むように誘惑される可能性があります。はい、さまざまな技術的および非技術的制約のためにこれは不可能な場合がありますが、痛みのポイントを回避する代わりに解決することは良いことです:)

49
Charlie

PowerMockは、静的メソッド、コンストラクター、最終クラスとメソッド、プライベートメソッド、静的初期化子の削除などのモックを可能にするMockitoの拡張機能です。

7
Premraj

Powermock mockito拡張のもう1つの機能は、 equalsとhashcodeのモックとスタブをサポート です。

すべてのpowermock機能は注意して使用する必要がありますが、特定の結果に(値ベースの)平等性を追加すると役立つ場合があります。

6
avandeursen

PowerMockのもう1つの機能は、メソッドで 新しいオブジェクトのモック構築 ができることです。テストするメソッドのコードを変更できない場合に役立ちます。

4
Caesar

Finalクラスをモックするには、org.mockito.plugins.MockMakerを使用できます。あなたがする必要があるのは

  1. test/resourceフォルダーに名前mockito-extensionsのフォルダーを作成します。
  2. その下にorg.mockito.plugins.MockMakerという名前のファイルを作成します。
  3. そのファイルにはmock-maker-inlineという1行だけがあります

これにより、新しいライブラリを追加する必要がなくなり、ランタイムを節約できます。

0
Anuj Acharya