Powermock a Mockito se používají k zesměšňování v Javě, ale slouží různým účelům a mají odlišné vlastnosti, zejména v tom, jak zvládají zesměšňování prostřednictvím svých příslušných implementací „Mockmaker“.
PowerMock's Mockmaker
Powermock rozšiřuje další falešné knihovny, jako jsou Easymock a Mockito, poskytováním silnějších schopností. Používá vlastní manipulaci s třídami a bytecodem, aby umožnil zesměšňování statických metod, konstruktérů, konečných tříd a metod, soukromých metod a odstranění statických inicializátorů [4] [9]. „Mockmaker“ PowerMock je implementován třídou „PowerMockmaker“, která v případě potřeby deleguje na další „Mockmaker“. To umožňuje PowerMock pracovat společně s dalšími výsměšnými rámcemi bez konfliktů za předpokladu, že je správně nakonfigurován [7].
Přístup Powermock je invazivnější a vyžaduje, aby manipulace s bajtem dosáhla svých pokročilých schopností zesměšňování. To může být prospěšné pro složité scénáře, kde samotné Mockito není dostatečné, jako je zesměšňování statických metod nebo soukromých metod [9].
Mockito's Mock-Maker-Inline
Mockito's „Mock-Maker-Inline“ je funkce zavedená, která umožňuje zesměšňování konečných tříd a metod. Nevyžaduje manipulaci s bajtecode, jako je PowerMock, ale místo toho používá API Java Instrumentation API k úpravě tříd za běhu. Tento přístup je méně invazivní a nepotřebuje vlastní třídu [2] [8].
Chcete-li povolit `simulovaný tvůrce-inline`, obvykle přidáte soubor s názvem` org.mockito.plugins.mockmaker` s obsahem `simulovač-inline` v adresáři` src/test/resources/mockito-extensions`. Alternativně můžete použít artefakt „mockito-inline“, který tento proces zjednodušuje tím, že nevyžaduje manuální konfiguraci rozšíření „Mockmaker“ [2] [10].
Mockito 5.0.0 a novější verze používají jako výchozí simulovací výrobce `simulovače-inline`, což usnadňuje zesměšňování konečných tříd a metod bez další konfigurace [3] [10].
Klíčové rozdíly
-Invazivita: PowerMock je invazivnější díky použití manipulace s bajtecodem a vlastní třídy, zatímco Mockito's „Mock-Maker-Inline“ používá Java Instrumentation, což je méně invazivní.
- Schopnosti: PowerMock může zesměšňovat statické metody, konstruktory a soukromé metody, které Mockito nemůže obejít bez dalších nástrojů, jako je `mockito-inline` pro konečné třídy a metody.
-Konfigurace: PowerMock vyžaduje, aby konkrétní konfigurace delegovala na jiné implementace „mockmaker“, zatímco Mockito's „Mock-Maker-Inline“ lze povolit pomocí jednoduchého konfiguračního souboru nebo pomocí artefaktu „mockito-inline“.
-Výchozí chování: V Mockito 5 a novějším je výchozí, zatímco PowerMock vždy vyžaduje explicitní nastavení, aby používal své pokročilé funkce.
Stručně řečeno, zatímco jak powermock, tak Mockito je „falešný tvůrce-inline“ zvyšuje schopnosti zesměšňování, výrazně se liší ve svém přístupu, invazivitě a typech zesměšňování, které podporují. PowerMock je výkonnější, ale také složitější, zatímco Mockito's „Mock-Maker-Inline“ nabízí jednodušší způsob, jak zesměšňovat konečné třídy a metody.
Citace:[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/classs/org.mockito.plugins.mockmaker
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/classs/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-does-twork-to-final-methods