Powermock's WhiteBox in Mockito's WhiteBox sta oba uporabljena razreda, ki se uporabljata za dostop in manipuliranje z notranjimi stanji razredov, vendar imata različne razlike v svojem izvoru, funkcionalnosti in kontekstu uporabe.
Izvor in razpoložljivost
- Mockito's WhiteBox: To je bil notranji razred znotraj Mockito, ki je uporabnikom omogočil nastavitev notranjih stanj predmetov. Vendar je bil odstranjen iz Mockito 2.x zaradi pomislekov o spodbujanju slabih praks testiranja in ker ni bil namenjen javni uporabi [11]. Uporabniki, ki so se nanjo zanašali, so bili spodbujeni, da preklopijo na alternative, kot je Powermock's WhiteBox, ali izvajajo lastne pripomočke za refleksije [3].
- Powermock's WhiteBox: To je del knjižnice PowerMock, ki razširja zmožnosti Mockitoja, tako da med drugimi značilnostmi omogoča norčevanje zasebnih, statičnih in končnih metod [5]. Powermock's WhiteBox ponuja poenostavljeno refleksno pripomoček, namenjen testom, ki omogoča dostop do zasebnih članov in priklic zasebnih metod [2] [6].
Funkcija
- Mockito's WhiteBox (zgodovinsko): Pred odstranitvijo je Mockito's WhiteBox uporabnikom omogočil, da nastavijo notranja stanja predmetov z uporabo metod, kot je "setInternalState". To je bilo koristno za vbrizgavanje posnetkov v razrede brez javnih nastavitev.
- Powermock's WhiteBox: ponuja širši nabor funkcionalnosti, vključno z:
- Dostop do zasebnih članov: Metode, kot je "getInternalState", omogočajo iskanje vrednosti zasebnega polja.
- prikliče zasebne metode: metoda `invokeMethod` lahko pokliče zasebne metode, vključno s statičnimi [4] [10].
- Nastavitev zasebnih polj: Čeprav ni izrecno dokumentirana, lahko Powermock's WhiteBox uporabimo za nastavitev zasebnih polj z razmislekom, čeprav to ni njegov glavni namen.
Kontekst uporabe
- Mockito's WhiteBox: Ker ni več na voljo v Mockito 2.x, uporabnikom svetujemo, da uporabljajo alternative, kot sta Powermock's WhiteBox ali Spring 'ReflectionTestutils`, če je primerno [1] [3].
- PowerMock's WhiteBox: Običajno se uporablja v scenarijih, kjer je neposreden dostop do zasebnih članov ali metod potreben, pogosto v zapuščeni kodi ali pri testiranju kompleksne logike, ki je ni mogoče enostavno ponovno preusmeriti. Vendar je na splošno priporočljivo, da se izognete uporabi takšnih pripomočkov, razen če je to nujno potrebno, saj lahko zaobidejo inkapsulacijo in vodijo do krhkih testov [10].
Če povzamemo, medtem ko obe pripomočki Whitebox služita podobnim namenom, je različica PowerMock bolj celovita in široko dostopna, medtem ko je bila Mockitova različica odstranjena zaradi pomislekov glede praks testiranja. Powermock's Whitebox je močno orodje za dostop in manipulacijo z notranjimi državami, vendar ga je treba uporabljati preudarno.
Navedbe:[1] https://stackoverflow.com/questions/40280918/what-do-i-use-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://proandroidd.com/mockito-2-x-x-over-powermock-migration-tips-and-Tricks-TEN-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/whetebox.html
[7] https://github.com/mockito/mockito/isissue/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-encapsulacija
[11] https://github.com/mockito/mockito/isissue/489
[12] https://code.haleby.se/2017/02/03/a-case-for-powermock/