Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Quali sono le principali differenze tra Whitebox di Powermock e Whitebox di Mockito


Quali sono le principali differenze tra Whitebox di Powermock e Whitebox di Mockito


Whitebox di Powermock e Whitebox di Mockito sono entrambe le classi di utilità utilizzate per accedere e manipolare gli stati interni delle classi, ma hanno differenze distinte nelle loro origini, funzionalità e contesti di utilizzo.

origine e disponibilità

- Whitebox di Mockito: questa era una classe interna all'interno di Mockito che consentiva agli utenti di impostare stati interni di oggetti. Tuttavia, è stato rimosso da Mockito 2.x a causa delle preoccupazioni sulla promozione di cattive pratiche di test e perché non era destinato all'uso pubblico [11]. Gli utenti che si sono affidati sono stati incoraggiati a passare a alternative come Whitebox di Powermock o implementare le proprie utility di riflessione [3].

- Whitebox di Powermock: questo fa parte della libreria Powermock, che estende le capacità di Mockito consentendo il beffardo di metodi privati, statici e finali, tra le altre caratteristiche [5]. Whitebox di Powermock fornisce un'utilità di riflessione semplificata destinata ai test, consentendo l'accesso ai membri privati ​​e l'invocazione di metodi privati ​​[2] [6].

Funzionalità ##

- Whitebox di Mockito (storico): prima della sua rimozione, Whitebox di Mockito ha permesso agli utenti di impostare stati interni di oggetti usando metodi come "setInternalState". Ciò è stato utile per iniettare derche in classi senza setter pubblici.

- Whitebox di Powermock: offre una serie più ampia di funzionalità, tra cui:
- Accesso ai membri privati: metodi come `GetInternalState` consentono il recupero dei valori di campo privato.
- Invocazione di metodi privati: il metodo `invokemethod` può chiamare metodi privati, compresi quelli statici [4] [10].
- Impostazione dei campi privati: sebbene non esplicitamente documentati, il Whitebox di Powermock può essere utilizzato per impostare i campi privati ​​attraverso la riflessione, sebbene questo non sia il suo scopo principale.

contesto di utilizzo

- Whitebox di Mockito: poiché non è più disponibile in Mockito 2.x, gli utenti si consigliano di utilizzare alternative come Whitebox di Powermock o "ReflectionTestUtils" di Spring se applicabile [1] [3].

- Whitebox di Powermock: in genere utilizzato negli scenari in cui è necessario l'accesso diretto ai membri privati ​​o ai metodi, spesso nel codice legacy o quando si verificano una logica complessa che non può essere facilmente refactord. Tuttavia, si raccomanda generalmente di evitare di utilizzare tali utilità se non assolutamente necessarie, in quanto possono bypassare l'incapsulamento e portare a test fragili [10].

In sintesi, mentre entrambe le utility Whitebox servono a scopi simili, la versione di Powermock è più completa e ampiamente disponibile, mentre la versione di Mockito è stata rimossa a causa delle preoccupazioni sulle pratiche di test. Whitebox di Powermock è un potente strumento per accedere e manipolare gli stati di classe interna, ma dovrebbe essere usato con giudizio.

Citazioni:
[1] https://stackoverflow.com/questions/40280918/what-do-o-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-over-powermock-migration-tips-ands-sricks-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.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/