PowerMock și Mockito sunt ambele folosite pentru a batjocori în Java, dar servesc scopuri diferite și au caracteristici distincte, în special în modul în care se ocupă de batjocoritor prin implementările lor „Mockmaker”.
PowerMock's Mocmaker
PowerMock extinde alte biblioteci Mock precum EasyMock și Mockito oferind capacități mai puternice. Utilizează o manipulare personalizată de încărcare și bytecode pentru a permite batjocurarea metodelor statice, constructorilor, claselor și metodelor finale, metode private și eliminarea inițializatorilor statici [4] [9]. „Mockmaker” de la PowerMock este implementat de clasa „Powermockmaker”, care delegă apelurile la un alt „Mockmaker”, dacă este nevoie. Acest lucru permite Powermock să funcționeze alături de alte cadre de batjocură fără conflicte, cu condiția să fie configurat corect [7].
Abordarea lui PowerMock este mai invazivă, necesitând manipularea Bytecode pentru a -și atinge capacitățile avansate de batjocură. Acest lucru poate fi benefic pentru scenarii complexe în care Mockito singur este insuficient, cum ar fi metodele statice batjocoritoare sau metodele private [9].
Mockito-Maker-Inline
„Mock-Maker-Inline” de la Mockito este o caracteristică introdusă pentru a permite batjocurarea claselor și metodelor finale. Nu necesită o manipulare Bytecode precum PowerMock, ci folosește în schimb API -ul de instrumentare Java pentru a modifica clasele la runtime. Această abordare este mai puțin invazivă și nu are nevoie de un încărcător de clasă personalizat [2] [8].
Pentru a activa „Mock-Maker-Inline”, adăugați de obicei un fișier numit `org.mockito.plugins.MockMaker` cu conținutul` Mock-Maker-Inline` în directorul `Src/Test/Resurse/Mockito-Extensions`. În mod alternativ, puteți utiliza artefactul „Mockito-Inline”, care simplifică procesul, fără a necesita configurația manuală a fișierului de extensie `MockMaker` [2] [10].
Mockito 5.0.0 și versiunile ulterioare folosesc `Mock-Maker-Inline` ca producător implicit de Mock, făcând mai ușor să batjocorești clase și metode finale fără configurare suplimentară [3] [10].
Diferențe cheie
-Invazivitate: Powermock este mai invaziv datorită utilizării sale de manipulare Bytecode și a unui încărcător de clasă personalizat, în timp ce „Mock-Maker-Inline” de la Mockito folosește instrumentația Java, care este mai puțin invazivă.
- Capabilități: PowerMock poate batjocori metode statice, constructori și metode private, pe care Mockito nu le poate face fără instrumente suplimentare, cum ar fi „Mockito-inline” pentru clase și metode finale.
-Configurare: PowerMock necesită o configurație specifică pentru a delega alte implementări „MockMaker”, în timp ce „Mock-Maker-Inline” de la Mockito poate fi activat cu un fișier de configurare simplu sau prin utilizarea artefactului `Mockito-inline`.
-Comportament implicit: în Mockito 5 și mai târziu, `Mock-Maker-Inline` este implicit, în timp ce PowerMock necesită întotdeauna configurare explicită pentru a utiliza funcțiile sale avansate.
În rezumat, în timp ce atât PowerMock, cât și „Mock-Maker-Inline” îmbunătățesc capacitățile de batjocură, acestea diferă semnificativ în abordarea, invazivitatea și tipurile de batjocură pe care le susțin. PowerMock este mai puternic, dar și mai complex, în timp ce „Mock-Maker-Inline” de la Mockito oferă o modalitate mai simplă de a batjocori clasele și metodele finale.
Citări:[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-lone
[10] https://stackoverflow.com/questions/53274463/what-is-mockito-inline-and-how-does-it-work-to-mock-final-methods