静的メソッドについてここでいくつかのスレッドを読み、静的メソッドの誤用/過度の使用が引き起こす可能性がある問題を理解していると思います。しかし、静的メソッドをモックするのが難しい理由の根本には至りませんでした。
PowerMockなどの他のモックフレームワークがそれを実行できることを知っていますが、なぜMockitoができないのですか?
私はこの記事を読みましたが、作者は宗教的にこの言葉static
に反対しているようです。おそらく私の理解不足です。
簡単な説明/リンクがいいでしょう。
静的メソッドについてここでいくつかのスレッドを読み、静的メソッドの誤用/過度の使用が引き起こす可能性がある問題を理解していると思います。しかし、静的メソッドをモックするのが難しい理由の根本には至りませんでした。
PowerMockなどの他のモックフレームワークがそれを実行できることを知っていますが、なぜMockitoができないのですか?
私はこの記事を読みましたが、作者は宗教的にこの言葉static
に反対しているようです。おそらく私の理解不足です。
簡単な説明/リンクがいいでしょう。
回答:
モックオブジェクトライブラリは通常、実行時にクラスを動的に作成することにより(cglibを使用して)モックを作成するためと思われます。これは、実行時にインターフェースを実装するか(私が誤っていない場合はEasyMockが行うこと)、またはクラスから継承してモックする(誤っていない場合はMockitoが行うこと)のいずれかです。継承を使用してそれらをオーバーライドすることはできないため、どちらの方法も静的メンバーに対しては機能しません。
静的をモックする唯一の方法は、実行時にクラスのバイトコードを変更することです。これは継承よりも少し複雑だと思います。
それは価値があるので、それは私の推測です...
静的メソッドを模擬する必要がある場合、それは悪いデザインの強力な指標です。通常、テスト対象のクラスの依存関係を模倣します。テスト対象のクラスが静的メソッド(たとえば、java.util.Math#sinなど)を参照している場合は、テスト対象のクラスが正確にこの実装を必要としていることを意味します(たとえば、精度対速度)。具体的な正弦の実装から抽象化したい場合は、おそらくインターフェイスが必要です(これがどこに行くのかわかりますか)?
静的メソッドをモックする必要がある場合は、コードのにおいだと本気で思っています。
これは私には行き過ぎと思われる唯一の時間は、グアバのようなLIBSですが、ロジックのそれの一部...(Iterables.transform(のようなもの。))を引き起こす種類とにかくこれを模擬する必要はありません
そのように独自のコードクリーンな状態を保ち、すべての依存関係をクリーンな方法でモックアウトでき、外部の依存関係に対する破損防止レイヤーがあります。PowerMockを実際に見たことがありますが、PowerMockに必要なすべてのクラスの設計が不十分でした。また、PowerMockの統合により、重大な問題が発生することもあります
(例:https : //code.google.com/p/powermock/issues/detail?id=355 )
PS:プライベートメソッドについても同様です。私はテストがプライベートメソッドの詳細について知っているべきではないと思います。クラスが非常に複雑で、プライベートメソッドをモックアウトしようとする場合は、おそらくそのクラスを分割する兆候です...
@Inject SomeDependency
と構成で定義しますbind(SomeDependency.class).in(Singleton.class)
。したがって、明日それがシングルトンではなくなった場合、1つの構成を変更すればそれだけです。
Foo.getInstance()
どこにでも電話するという古い学校のシングルトンパターンについて決して話しませんでした。「静的メソッドは多くのラッパーオブジェクトの作成を必要としない」という議論に対抗するために、答えにシングルトンを書いただけです。また、私にとって概念的には、シングルトンの静的メソッドとインスタンスメソッドの違いはほとんどありません。このシングルトンコラボレーターをモックすることはできません。しかし、シングルトンであるかどうかは、私が意図していたことではありません。コラボレーターを注入して模擬し、テストが困難な場合は静的メソッドを呼び出さないことが重要です。
場合によっては、特にそれらをモックする必要がある場合、静的メソッドをテストするのが難しい場合があります。そのため、ほとんどのモックフレームワークは静的メソッドをサポートしていません。このブログ投稿は、静的メソッドとクラスをモックする方法を決定するのに非常に役立つことがわかりました。