Whitebox Whitebox PowerMock a Mockito Whitebox jsou jak inženýrské třídy používané pro přístup a manipulaci s interními stavy tříd, ale mají zřetelné rozdíly v jejich původu, funkcích a kontextu využití.
Původ a dostupnost
- Mockito's Whitebox: Jednalo se o interní třídu v rámci Mockito, která uživatelům umožnila nastavit interní stavy objektů. Byl však odstraněn z Mockito 2.x kvůli obavám z podpory špatných testovacích postupů a protože nebyl určen pro veřejné použití [11]. Uživatelé, kteří se na to spoléhali, byli povzbuzováni k přechodu na alternativy, jako je Whitebox PowerMock nebo implementovat své vlastní reflexní nástroje [3].
- Whitebox PowerMock: Toto je součást knihovny PowerMock, která rozšiřuje schopnosti Mockito tím, že mimo jiné umožňuje zesměšňování soukromých, statických a konečných metod [5]. Whitebox PowerMock poskytuje zjednodušenou reflexní užitečnost určenou pro testy, což umožňuje přístup k soukromým členům a vyvolání soukromých metod [2] [6].
Funkce
- Mockito's Whitebox (Historical): Před jeho odstraněním umožnil Whitebox Mockito uživatelům nastavit interní stavy objektů pomocí metod jako `SetInternalState`. To bylo užitečné pro injekci zesměšňování do tříd bez veřejných setters.
- Whitebox PowerMock: nabízí širší sadu funkcí, včetně:
- Přístup k soukromým členům: Metody jako `getInternalState` umožňují vyhledání hodnot soukromých polí.
- Vyvolání soukromých metod: Metoda `invokeMethod` může volat soukromé metody, včetně statických metod [4] [10].
- Nastavení soukromých polí: Ačkoli to není výslovně zdokumentováno, může být Whitebox PowerMock použita k nastavení soukromých polí prostřednictvím odrazu, i když to není jeho primární účel.
Kontext použití
- Mockito's Whitebox: Vzhledem k tomu, že již není k dispozici v Mockito 2.x, je uživatelům doporučeno používat alternativy, jako je Whitebox PowerMock nebo Spring's ReflectionTestutils`, pokud je to použitelné [1] [3].
- Whitebox PowerMock: Obvykle se používá ve scénářích, kde je nezbytný přímý přístup k soukromým členům nebo metodám, často ve starém kódu nebo při testování složité logiky, kterou nelze snadno refactored. Obecně se však doporučuje vyhnout se používání takových nástrojů, pokud není nezbytně nutné, protože mohou obejít zapouzdření a vést k křehkým testům [10].
Stručně řečeno, zatímco obě nástroje Whitebox slouží podobným účelům, verze PowerMock je komplexnější a široce dostupná, zatímco Mockitoova verze byla odstraněna kvůli obavám z testovacích postupů. Whitebox PowerMock je výkonným nástrojem pro přístup a manipulaci s vnitřním třídou, ale měl by být používán uvážlivě.
Citace:[1] https://stackoverflow.com/questions/40280918/What-Suse-instead-of-whiteBox-in Mockito-2-2-to-set polí
[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-sigration-tips-and-tricks-top --118C52ABD1D8
[4] https://johnmullins.co
[5] https://www.calsoftick.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.alibabacloud.com/blog/598057
[9] https://www.lambdatest.com/automation-testing-advisor/selenium/classs/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/