Die Whitebox von PowerMock und Mockito von PowerMock sind beide Versorgungsklassen, die zum Zugriff auf und zum Manipulieren interner Klassenzustände verwendet werden, aber sie haben unterschiedliche Unterschiede in ihren Ursprüngen, Funktionen und Nutzungskontexten.
Herkunft und Verfügbarkeit
- Mockitos WhiteBox: Dies war eine interne Klasse innerhalb von Mockito, mit der Benutzer interne Zustände von Objekten festlegen konnten. Es wurde jedoch aufgrund von Bedenken hinsichtlich der Förderung schlechter Testpraktiken aus Mockito 2.x entfernt und weil es nicht für die öffentliche Verwendung gedacht war [11]. Benutzer, die sich darauf verlassen, wurden ermutigt, zu Alternativen wie der WhiteBox von PowerMock zu wechseln oder ihre eigenen Reflexions -Dienstprogramme zu implementieren [3].
- PowerMocks Whitebox: Dies ist Teil der PowerMock -Bibliothek, die die Funktionen von Mockito erweitert, indem er unter anderem das Verspotten von privaten, statischen und endgültigen Methoden ermöglicht [5]. Die Whitebox von PowerMock bietet ein vereinfachtes Reflexionsdienstprogramm für Tests, das den Zugriff auf private Mitglieder und die Aufforderung privater Methoden ermöglicht [2] [6].
Funktionalität
- Mockitos Whitebox (historisch): Vor seiner Entfernung konnten Benutzer mit Mockito internen Zuständen von Objekten mithilfe von Methoden wie "setInternalState" festlegen. Dies war nützlich, um Schein in Klassen ohne öffentliche Setter zu injizieren.
- Whitebox von PowerMock: bietet einen breiteren Satz von Funktionen, einschließlich:
- Zugriff auf private Mitglieder: Methoden wie "GetInternalstate" abrufen private Feldwerte.
- Aufrufen privater Methoden: Die "Invokemethod" -Methode kann private Methoden aufrufen, einschließlich statischer [4] [10].
- Setzen Sie private Felder: Obwohl die WhiteBox von PowerMock nicht explizit dokumentiert ist, kann die PowerMock verwendet werden, um private Felder durch Reflexion festzulegen, obwohl dies nicht ihr Hauptzweck ist.
Verwendungskontext
- Mockitos Whitebox: Da sie in Mockito 2.x nicht mehr verfügbar sind, wird den Benutzern empfohlen, Alternativen wie die Whitebox von PowerMock oder Spring "ReflectionTestutils" zu verwenden [1] [3].
- Whitebox von PowerMock: In Szenarien, in denen ein direkter Zugriff auf private Mitglieder oder Methoden erforderlich ist, häufig in Legacy -Code oder beim Testen einer komplexen Logik, die nicht leicht nachgearbeitet werden kann. Es wird jedoch im Allgemeinen empfohlen, solche Versorgungsunternehmen zu vermeiden, es sei denn, sie können die Kapselung umgehen und zu spröden Tests führen [10].
Zusammenfassend, während beide Whitebox -Dienstprogramme ähnliche Zwecke dienen, ist die Version von PowerMock umfassender und weit verbreitet, während die Version von Mockito aufgrund von Bedenken hinsichtlich der Testpraktiken entfernt wurde. Die Whitebox von PowerMock ist ein leistungsstarkes Werkzeug zum Zugriff auf und zum Manipulieren interner Klassenzustände, sollte jedoch mit Bedacht verwendet werden.
Zitate:[1] https://stackoverflow.com/questions/40280918/what-do-i-use-use-in-instead-of-whitebox-in-mockito-2-t-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-over-powermock-migration-tip-and-trick-top-top-118c52abd1d8
[4] https://johnmullins.co
[5] https://www.calsoftinc.com/blogs/unit-testing-mockito-bowermockito.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.alibabacloud.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-capsulation
[11] https://github.com/mockito/mockito/issues/489
[12] https://code.haleby.se/2017/02/03/a-case-for-powermock/