Il metodo `reset ()` di Mockito è una funzione che consente di ripristinare un oggetto simulato in modo che possa essere riutilizzato. Tuttavia, il suo utilizzo è generalmente scoraggiato dagli sviluppatori e dagli utenti mockito, in quanto può indicare test o codice scarsamente progettati che sono troppo complessi e difficili da testare in modo pulito [7] [9]. Invece, l'approccio raccomandato è quello di creare nuove simulazioni per ciascun metodo di test per garantire l'indipendenza e la chiarezza nei test [7] [9].
Confronto con altre biblioteche deriderie
1. JMock2: a differenza di Mockito, JMock2 utilizza un contesto per gestire le aspettative e le informazioni simulate, che viene ricostruita per ciascun metodo di prova. Ciò significa che JMock2 non richiede un ripristino esplicito come fa Mockito [10]. L'approccio di JMock2 aiuta a mantenere l'isolamento del test senza bisogno di ripristinare manualmente le derche.
2. EasyMock: anche EasyMock non richiede in genere un metodo di ripristino. È progettato per creare nuovi oggetti finti per ogni test, simile alla pratica consigliata con mockito. Szczepan Faber, uno sviluppatore di mockito, menziona che non aveva mai avuto bisogno di una funzione di ripristino durante l'utilizzo di EasyMock [8].
3. Mockito vs. altre librerie: in generale, altre librerie deriderie come JMock2 e EasyMock promuovono un approccio di test più pulito gestendo automaticamente lo stato finto o incoraggiando la creazione di nuove becche per ogni test. Il metodo `reset ()` di Mockito è più un'eccezione piuttosto che la norma nei framework beffardo.
Best practice
- Evitare l'utilizzo di `reset ()`: a meno che non sia assolutamente necessario, ad esempio quando una finta viene iniettata da un contenitore e non può essere ricreato per ogni test, si consiglia di evitare di usare `reset ()`. Invece, concentrati sulla creazione di test semplici e focalizzati con nuovi simulazioni per ogni scenario [7] [9].
- Utilizzare `clearInvocations ()`: se è necessario cancellare le interazioni senza ripristinare lo stuzzichino, utilizzare `clearInvocations ()`. Questo metodo consente di preservare lo stuzzichino durante la cancellazione di eventuali interazioni registrate, il che può essere utile in determinati scenari [5].
- Codice di refactor per testabilità: se ti ritrovi a dover utilizzare `reset ()`, può indicare che il codice potrebbe beneficiare del refactoring per renderlo più verificabile. Ciò potrebbe comportare la rompere metodi complessi o il miglioramento dell'iniezione di dipendenza [9].
In sintesi, mentre Mockito fornisce un metodo `reset ()`, il suo uso è generalmente scoraggiato a favore della creazione di nuove simulazioni per ogni test. Altre biblioteche deridenti spesso promuovono pratiche simili, enfatizzando test puliti e indipendenti su una management finta complessa.
Citazioni:[1] https://www.tutorialspoint.com/mockito/mockito_resetting_mock.htm
[2] https://groups.google.com/g/mockito/c/y_ihdc8lx_m
[3] https://www.vogella.com/tutorials/mockito/article.html
[4] https://www.lambdatest.com/automation-testing-advisor/selenium/methods/org.mockito.mockito.reset
[5] https://www.toptal.com/java/a-guide-to-everyday-mockito
[6] https://www.jrebel.com/blog/mock-unit-testing-with-mockito
[7] https://stackoverflow.com/questions/34412106/appropriate-use-of-mockito-reset
[8] https://groups.google.com/g/mockito/c/_vxg33tlzl8
[9] https://softwareEngineering.stackexchange.com/questions/188299/is-this-an-appied-usao-of-mockitos-reset-method
[10] https://stackoverflow.com/questions/18164123/how-to-clean-up-mocks-in-spring-tests-when-using-mockito