Powermocks Whitebox og Mockitos Whitebox er begge verktøyklasser som brukes til å få tilgang til og manipulere interne tilstander av klasser, men de har tydelige forskjeller i deres opprinnelse, funksjonalitet og brukskontekster.
Opprinnelse og tilgjengelighet
- Mockitos Whitebox: Dette var en intern klasse innen Mockito som tillot brukere å sette interne tilstander av objekter. Imidlertid ble den fjernet fra Mockito 2.x på grunn av bekymring for å fremme dårlig testingspraksis og fordi det ikke var beregnet på offentlig bruk [11]. Brukere som stolte på det ble oppfordret til å bytte til alternativer som Powermocks Whitebox eller implementere sine egne refleksjonsverktøy [3].
- Powermocks Whitebox: Dette er en del av Powermock -biblioteket, som utvider Mockitos evner ved å tillate hån mot private, statiske og endelige metoder, blant andre funksjoner [5]. Powermocks Whitebox gir et forenklet refleksjonsverktøy beregnet på tester, noe som muliggjør tilgang til private medlemmer og påkallelse av private metoder [2] [6].
Funksjonalitet
- Mockitos Whitebox (historisk): Før den fjerning, tillot Mockitos Whitebox brukere å angi interne tilstander av objekter ved å bruke metoder som `SetInternalState`. Dette var nyttig for å injisere hån i klasser uten offentlige setters.
- Powermocks Whitebox: tilbyr et bredere sett med funksjonaliteter, inkludert:
- Å få tilgang til private medlemmer: Metoder som `GetInternalState` Tillat henting av private feltverdier.
- Påkalle private metoder: "Invokemethod` -metoden kan kalle private metoder, inkludert statiske [4] [10].
- Innstilling av private felt: Selv om det ikke er eksplisitt dokumentert, kan Powermocks Whitebox brukes til å sette private felt gjennom refleksjon, selv om dette ikke er dets primære formål.
Brukskontekst
- Mockitos Whitebox: Siden den ikke lenger er tilgjengelig i Mockito 2.x, anbefales brukerne å bruke alternativer som Powermocks Whitebox eller Springs `ReflectionTestils` hvis aktuelt [1] [3].
- Powermocks Whitebox: vanligvis brukt i scenarier der direkte tilgang til private medlemmer eller metoder er nødvendig, ofte i arvkode eller når du tester kompleks logikk som ikke lett kan refactores. Imidlertid anbefales det generelt å unngå å bruke slike verktøy med mindre de er absolutt nødvendige, da de kan omgå innkapsling og føre til sprø tester [10].
Oppsummert, mens begge Whitebox -verktøyene tjener lignende formål, er Powermocks versjon mer omfattende og allment tilgjengelig, mens Mockitos versjon ble fjernet på grunn av bekymring for testpraksis. Powermocks Whitebox er et kraftig verktøy for å få tilgang til og manipulere interne klassestater, men bør brukes på en god måte.
Sitasjoner:[1] https://stackoverflow.com/questions/40280918/what-do-i-use-instead-of-whitebox-in-mockito-2-2-to-set-felt
[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-tips-and-trick-top-gen-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.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-encapsulation
[11] https://github.com/mockito/mockito/issues/489
[12] https://code.haleby.se/2017/02/03/a-case-for-powermock/