Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon PowerMockのWhiteBoxとMockitoのWhiteBoxの主な違いは何ですか


PowerMockのWhiteBoxとMockitoのWhiteBoxの主な違いは何ですか


PowerMockのWhiteBoxとMockitoのWhiteBoxはどちらも、クラスの内部状態へのアクセスと操作に使用されるユーティリティクラスですが、起源、機能性、および使用状況に異なる違いがあります。

##起源と可用性

-MockitoのWhiteBox:これは、ユーザーがオブジェクトの内部状態を設定できるようにするMockito内の内部クラスでした。ただし、悪いテスト慣行の促進に関する懸念と、公共の使用を意図していなかったため、Mockito 2.xから削除されました[11]。それに依存していたユーザーは、PowerMockのWhiteBoxなどの代替品に切り替えるか、独自の反射ユーティリティを実装することをお勧めします[3]。

-PowerMockのWhiteBox:これはPowerMockライブラリの一部であり、プライベート、静的、および最終的な方法のモッキングを可能にすることにより、Mockitoの機能を拡張します[5]。 PowerMockのWhiteBoxは、テスト用に意図された単純化された反射ユーティリティを提供し、プライベートメンバーへのアクセスを可能にし、プライベート方法の呼び出しを可能にします[2] [6]。

##機能

-MockitoのWhiteBox(歴史):削除する前に、MockitoのWhiteBoxは、「SetInternalState」などの方法を使用してオブジェクトの内部状態を設定することができました。これは、公開セッターのないクラスにモックを注入するのに役立ちました。

-PowerMockのWhiteBox:次のような幅広い機能セットを提供します。
- プライベートメンバーへのアクセス:「GetInternalState」などの方法で、プライベートフィールド値の取得を許可します。
- プライベートメソッドの呼び出し:「InvokeMethod」方法は、静的な方法[4] [10]を含むプライベートメソッドを呼び出すことができます。
- プライベートフィールドの設定:明示的に文書化されていませんが、PowerMockのWhiteBoxを使用してリフレクションを通じてプライベートフィールドを設定できますが、これは主要な目的ではありません。

##使用状況のコンテキスト

-MockitoのWhiteBox:Mockito 2.xではもう利用できなくなったため、ユーザーはPowerMockのWhiteBoxのような代替品や該当する場合は「ReflectionTestutils」などの代替案を使用することをお勧めします[1] [3]。

-PowerMockのWhiteBox:通常、プライベートメンバーまたはメソッドへの直接アクセスが必要なシナリオで使用されます。ただし、カプセル化をバイパスし、脆性テストにつながる可能性があるため、絶対に必要な場合を除き、そのようなユーティリティの使用を避けることを一般的にお勧めします[10]。

要約すると、両方のWhiteBoxユーティリティが同様の目的を果たしていますが、PowerMockのバージョンはより包括的で広く利用可能ですが、テストの実践に関する懸念のためにMockitoのバージョンは削除されました。 PowerMockのWhiteBoxは、内部クラスの状態にアクセスして操作するための強力なツールですが、慎重に使用する必要があります。

引用:
[1] https://stackoverflow.com/questions/40280918/what-do-iuse-instead-of-whitebox-in-mockito-2-2-to-set-fields
[2] https://www.javadoc.io/doc/org.powermock/powermock-reflect/1.6.5/org/powermock/reflect/whitebox.html
[3] https://proandroiddev.com/mockito-2-x-overmock-migration-tips-and-tricks-top-top-ten-118c52abd1d8
[4] https://johnmullins.co
[5] https://www.calsoftinc.com/blogs/unit-testing-mockito-powermockito.html
[6] https://www.javadoc.io/doc/org.powermock/powermock-reflect/latest/org/powermock/reflect/whitebox.html
[7] https://github.com/mockito/mockito/issues/422
[8] https://www.alibababacloud.com/blog/598057
[9] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.powermock.reflect.whitebox
[10] https://github.com/powermock/powermock/wiki/bypass-encapsulation
[11] https://github.com/mockito/mockito/issues/489
[12] https://code.haleby.se/2017/02/03/a-case-for-powermock/