62

Mockitoの上にPowerMockを追加すると、正確にはどのような機能が得られますか?

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

  • static、final、private メソッドのモック
  • 静的初期化子を削除
  • 依存性注入なしでモックを許可する - これは私にはわかりません。詳しく教えていただけますか?

他に何か追加しますか?数行にまとめていただけますか?

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

4

5 に答える 5

57

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

依存性注入なしでモックを許可する - これは私にはわかりません。詳しく教えていただけますか?

これは、テスト可能にするために静的メソッドを呼び出さないようにコードをリファクタリングする方法を説明しているMotivation 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 を使用できる場合は、それをモックして先に進みたいと思うかもしれません。はい、さまざまな技術的および非技術的な制約により、これが不可能な場合がありますが、'

于 2011-06-17T12:57:26.863 に答える
12

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

于 2016-08-09T00:15:34.203 に答える
6

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

すべてのパワーモック機能と同様に注意して使用する必要がありますが、特定の結果に対して (値ベースの) 同等性を追加すると役立つ場合があります。

于 2012-03-07T08:07:04.170 に答える
4

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

于 2015-10-07T08:36:56.067 に答える