Powermock e Mockito sono entrambi usati per deridere in Java, ma servono a scopi diversi e hanno caratteristiche distinte, in particolare nel modo in cui gestiscono il beffa attraverso le rispettive implementazioni di "Mockmaker".
Mockmaker di Powermock
Powermock estende altre biblioteche simulate come EasyMock e Mockito fornendo capacità più potenti. Utilizza una manipolazione personalizzata di classe e bytecode per consentire il beffardo di metodi statici, costruttori, classi e metodi finali, metodi privati e rimozione di inizializzatori statici [4] [9]. Il "mockmaker" di Powermock è implementato dalla classe "Powermockmaker", che delega chiama un altro "Mockmaker" se necessario. Ciò consente a Powermock di lavorare a fianco di altri framework di derisione senza conflitti, a condizione che sia configurato correttamente [7].
L'approccio di Powermock è più invasivo, che richiede una manipolazione di bytecode per ottenere le sue capacità di deroga avanzate. Ciò può essere utile per scenari complessi in cui il solo mockito è insufficiente, come deridere metodi statici o metodi privati [9].
Mockito Mock-Maker-inline
La "Mock-Maker-Inline" di Mockito è una funzione introdotta per consentire il beffardo di classi e metodi finali. Non richiede manipolazione di bytecode come PowerMock, ma utilizza invece l'API di strumentazione di Java per modificare le classi in fase di esecuzione. Questo approccio è meno invasivo e non ha bisogno di un caricatore di classe personalizzato [2] [8].
Per abilitare `mock-maker-inline`, in genere si aggiunge un file chiamato` org.mockito.plugins.mockmaker` con il contenuto `mock-maker-inline` nella directory` src/test/risorse/mockito-estensions`. In alternativa, è possibile utilizzare l'artefatto `mockito-inline`, che semplifica il processo non richiedendo la configurazione manuale del file di estensione` mockmaker '[2] [10].
Le versioni mockito 5.0.0 e successive utilizzano `mock-maker-inline` come maker mock predefinito, rendendo più facile deridere le classi e i metodi finali senza configurazione aggiuntiva [3] [10].
differenze chiave
-Invasività: PowerMock è più invasivo a causa del suo uso della manipolazione bytecode e di un caricatore di classe personalizzato, mentre la strumentazione Java "Mock-Maker-inline" di Mockito usa la strumentazione Java, che è meno invasiva.
- Capacità: Powermock può deridere metodi statici, costruttori e metodi privati, che Mockito non può fare a meno strumenti aggiuntivi come `mockito-inline` per le classi e i metodi finali.
-Configurazione: PowerMock richiede una configurazione specifica per delegare ad altre implementazioni di "mockmaker", mentre il "mock-maker-inline" di Mockito può essere abilitato con un semplice file di configurazione o utilizzando l'artefatto `mockito-inline`.
-Comportamento predefinito: in mockito 5 e successivi, `mock-maker-inline` è il valore predefinito, mentre Powermock richiede sempre una configurazione esplicita per utilizzare le sue funzionalità avanzate.
In sintesi, mentre sia Powermock che Mockito "Mock-Maker-inline` migliorano le capacità di beffardo, differiscono significativamente nel loro approccio, invasività e i tipi di derisione che supportano. Powermock è più potente ma anche più complesso, mentre "Mock-Maker-inline" di Mockito offre un modo più semplice per deridere le classi e i metodi finali.
Citazioni:[1] https://github.com/powermock/powermock/wiki/mockito
[2] https://davidvlijmincx.com/posts/writing_higher_quality_tests_with_mockitos_inline_mock_maker/
[3] https://stackoverflow.com/questions/65986197/difference-between-mockito-core-vs-mockito-inline
[4] https://powermock.github.io
[5] https://javadoc.io/static/org.mockito/mockito-core/3.2.4/org/mockito/plugins/inlinemockmaker.html
[6] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.mockito.plugins.mockmaker
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.powermock.api.mockito.mockmaker.powermockmaker
[8] https://davidvlijmincx.com/posts/mockito_mock_final_methods_and_classes/
[9] https://stackoverflow.com/questions/6036450/powermock-mockito-vs-mockito-alone
[10] https://stackoverflow.com/questions/53274463/what-is-mockito-inline-and-how-does-it-work-to-mock-final-methods