Quando si lavora con Mockito, Hamcrest viene spesso utilizzato per i suoi matcher espressivi, che migliorano la leggibilità dei test. Tuttavia, ci sono alternative che possono funzionare bene con Mockito, ognuna con i propri punti di forza e di debolezza.
Assertj
Assertj è un'alternativa popolare a Hamcrest per la scrittura di asserzioni nei test unitari. Fornisce un'API fluente che molti sviluppatori trovano più facile da usare e più espressivi di Hamcrest. La sintassi di Assertj è spesso preferita per la sua leggibilità e la capacità di creare facilmente asserzioni personalizzate. Mentre Assertj non si integra direttamente con Mockito come Hamcrest, può essere utilizzato insieme a Mockito per le affermazioni, rendendo i test più leggibili e mantenibili. Tuttavia, AssertJ si concentra principalmente sulle asserzioni piuttosto che sulle più ampie capacità di abbinamento di Hamcrest [1] [3].
Verità
La verità è un'altra libreria di asserzione sviluppata da Google. Offre un'API fluente simile a AssertJ ma si concentra maggiormente sulla fornitura di un migliore supporto di completamento automatico negli IDE, che può essere utile per la scoperta di asserzioni disponibili. La verità non è comunemente usata con Mockito come Hamcrest ma può essere utilizzata per le affermazioni nei test. Come AssertJ, la verità è più focalizzata sulle asserzioni piuttosto che sulla corrispondenza generale che Hamcrest fornisce [3].
matcher integrati di mockito
Lo stesso simulato fornisce matcher che possono essere utilizzati per lo stoping e la verifica delle interazioni con oggetti finti. Questi matcher restituiscono il tipo che corrispondono (ad esempio, `qualsiasi (intero.class)` restituisce un `intero`), che è diverso dagli accompagnatori di Hamcrest che restituiscono un "matcher". Per usare i matcher Hamcrest con Mockito, puoi usare `argomthat` o` mockitohamcrest.argthat` per convertire un matcher Hamcrest in una forma simulata compatibile [7].
Implementazioni personalizzate
Per gli scenari in cui preferisci non utilizzare librerie esterne, è possibile implementare i tuoi matcher o affermazioni. Questo approccio consente il controllo completo sul comportamento e sulla sintassi, ma richiede più sforzi e manutenzione. In genere non è raccomandato a meno che tu non abbia esigenze molto specifiche che non sono soddisfatte dalle biblioteche esistenti.
Conclusione
Mentre Hamcrest è ampiamente utilizzato con Mockito grazie alla sua flessibilità ed espressività, alternative come Assertj e Truth possono migliorare la parte dell'asserzione dei test. Se stai cercando qualcosa che si integri bene con Mockito per scopi corrispondenti, Hamcrest rimane una scelta forte, ma puoi usare i suoi matcher insieme ad altre librerie di asserzione per un'esperienza di test più completa. In definitiva, la scelta dipende dalle tue esigenze e preferenze specifiche per quanto riguarda la leggibilità, la facilità d'uso e il tipo di affermazioni o corrispondenze che devi eseguire nei test.
Citazioni:[1] https://www.reddit.com/r/java/comments/nj7dvd/who_here_are_using_the_hamcrest_api_and_why/
[2] https://www.javacodegeeks.com/2015/11/hamcrest-matchers-tutorial.html
[3] https://truth.dev/comparison.html
[4] https://www.reddit.com/r/javahelp/comments/oqz8cn/unit_testing_with_mockito_framework_why_do_we/
[5] https://www.infoworld.com/article/2257253/junit-5-tutorial-part-1-unit-testing-with-junit-5-mockito-and-hamcrest.html
[6] https://softwareEngineering.stackexchange.com/questions/447953/alternatives-to-using-mock-libraries-such-as-mockito-in-unit-testing
[7] https://stackoverflow.com/questions/8348046/mockitos-matcher-vs-hamcrest-matcher
[8] https://stackoverflow.com/questions/12606196/what-is-the-alternative-to-using-the-deprecated-hamcrest-method-is