Anotările „generatemocks” și@@generatenicemocks` în Mockito sunt folosite pentru a genera clase de machetă pentru testarea unităților în aplicații DART și Flutter. În timp ce ambele adnotări servesc același scop principal, acestea diferă semnificativ în comportamentul lor atunci când se ocupă de apelurile metodei neîngrijite.
@GenerateMocks
- Comportament pentru metode neîngrijite: Când se apelează o metodă pe un obiect batjocoritor generat cu `@generatemocks` și nu a fost definit niciun ciot pentru această metodă, Mockito va arunca o excepție. Acest comportament vă asigură că definiți în mod explicit cioturi pentru toate metodele care se așteaptă să fie apelate în timpul unui test, contribuind la surprinderea potențialelor supravegheri în configurarea testelor.
- Utilizare: Această adnotare este de obicei utilizată atunci când doriți un control strict asupra comportamentului batjocoritorilor dvs., asigurându -vă că orice apeluri neașteptate sunt semnalizate imediat ca erori.
- Starea de deprecare: `@generatemocks` este considerată mai puțin recomandată în comparație cu`@generatenicemocks` datorită comportamentului său strict, ceea ce poate duce la mai mult cod de testare verbose, dacă nu este gestionat cu atenție.
@GenerateNiceMocks
- Comportament pentru metode neîngrijite: În schimb, machetele generate cu `@generatenicemocks` vor returna o valoare legală implicită pentru tipul de returnare a metodei atunci când se numește o metodă neîngrijită. Această valoare implicită nu este destinată utilizării în logica testului, ci servește pentru a preveni erorile de rulare din cauza valorilor nule sau lipsă.
- Utilizare: Această adnotare este recomandată pentru majoritatea cazurilor de utilizare, deoarece simplifică scrierea testelor prin reducerea necesității de a ciocni fiecare apel posibilă. Face testele mai robuste, evitând eșecurile din cauza cioturilor uitate.
- Caracteristici suplimentare: `@generateniceMocks` permite doar` Mockspec`s în lista sa de argumente, oferind mai multă flexibilitate în personalizarea claselor de batjocură generate. De exemplu, puteți specifica un nume personalizat pentru clasa Mock folosind parametrul `as` în` MockSpec`.
Diferențe cheie
1. Manevrarea metodelor neîngrijite: cea mai semnificativă diferență este modul în care fiecare adnotare gestionează apelul metodei fără cioturi explicite. `@Generatemocks` aruncă o excepție, în timp ce`@generatenicemocks` returnează o valoare implicită.
2. Simplitatea codului și robustetea: `@generateniceMocks` duce, în general, la un cod de testare mai simplu și mai robust, prin reducerea necesității de încăpățânare exhaustivă.
3. Personalizare: `@generateniceMocks` oferă mai multe opțiuni de personalizare prin` MockSpec`, permițând nume de clasă personalizate și alte configurații avansate.
În rezumat, `@generatenicemocks` este, în general, preferat pentru capacitatea sa de a simplifica codul de testare și de a reduce erorile din cauza metodelor neîngrijite, în timp ce`@generatemocks` oferă o abordare mai strictă care poate fi utilă în scenarii specifice în care este necesar un control explicit asupra comportamentului batjocoritor [1] [4] [11].
Citări:[1] https://www.amaysim.technology/blog/flutter-test-mockito-generatemocks-vs-generatenicemocks
[2] https://www.reddit.com/r/golang/comments/ua0hps/generated_vs_handwritten_mocks/
[3] https://blog.logrocket.com/unit-testing-futter-code-mockito/
[4] https://pub.dev/documentation/mockito/latest/annotations/generatenicmocks-class.html
[5] https://plugins.jetbrains.com/plugin/23513-generate-futter-mocks
[6] https://stackoverflow.com/questions/72390220/flutter-generatemocks-is-not-generated-mock-class
[7] https://github.com/dart-lang/mockito/blob/master/null_safety_readme.md
[8] https://github.com/dart-lang/mockito/issues/367
[9] https://github.com/dart-lang/mockito/issues/422
[10] https://stackoverflow.com/questions/74406977/the-generatemocks-annotation-contines-a-class-which-appears-to-elarydy-be-mocked
[11] https://pub.dev/packages/mockito