Adnotacje „@generateMocks` i@@generateniceMocks` w Mockito są używane do generowania próbnych klas do testowania jednostek w aplikacjach rzutek i trzepotania. Chociaż oba adnotacje służą temu samemu celowi, różnią się znacznie pod względem zachowania podczas obsługi wywołanych metod.
@GeneratEmocks
- Zachowanie metod nieokreślonych: Gdy metoda jest wywoływana na próbnym obiekcie wygenerowanym z `@generatEmocks` i nie został zdefiniowany dla tej metody, Mockito rzuci wyjątek. To zachowanie zapewnia jawne zdefiniowanie odcinków dla wszystkich metod, które mają zostać wywołane podczas testu, pomagając złapać potencjalne nadzór w konfiguracji testu.
- Zastosowanie: Ta adnotacja jest zwykle używana, gdy chcesz ścisłą kontrolę nad zachowaniem próbek, zapewniając, że każde nieoczekiwane wywołania metody zostaną natychmiast oznaczone jako błędy.
- Status amortyzacji: `@generatEmocks` jest uważany za mniej zalecany w porównaniu z`@generateniceMocks` ze względu na jego ścisłe zachowanie, co może prowadzić do bardziej pełnometrażowego kodu testowego, jeśli nie jest ono uważnie zarządzane.
@GenerateniceMocks
- Zachowanie metod nieokreślonych: Natomiast próby wygenerowane z `@generateniceMocks` zwrócą domyślną, prawną wartość dla typu zwrotu metody, gdy wywołana jest nieokreślona metoda. Ta domyślna wartość nie jest przeznaczona do użycia w logice testowej, ale służy zapobieganiu błędom środowiska wykonawczym z powodu wartości zerowych lub brakujących.
- Zastosowanie: Ta adnotacja jest zalecana dla większości przypadków użycia, ponieważ upraszcza pisanie testów, zmniejszając potrzebę kompetencji każdego możliwego wywołania metody. To sprawia, że testy są bardziej odporne, unikając awarii z powodu zapomnianych odcinków.
- Dodatkowe funkcje: `@generateniceMocks` pozwala tylko„ MockSpec ”na liście argumentów, zapewniając większą elastyczność w dostosowywaniu wygenerowanych klas próbnych. Na przykład możesz określić niestandardową nazwę dla klasy próbnej za pomocą parametru „jako” w „mockspec”.
Kluczowe różnice
1. Obsługa metod nieokreślonych: Najważniejszą różnicą jest sposób, w jaki każda adnotacja obsługuje wywołania metody bez wyraźnych odcinków. `@GenerateMocks` rzuca wyjątek, a`@generateniceMocks` zwraca wartość domyślną.
2. Prostota i solidność kodu: `@generateniceMocks` ogólnie prowadzi do prostszego i solidniejszego kodu testowego poprzez zmniejszenie potrzeby wyczerpującego uderzenia.
3. Dostosowywanie: `@generateniceMocks` oferuje więcej opcji dostosowywania poprzez` MockSpec`, umożliwiając niestandardowe nazwy klas próbnych i inne zaawansowane konfiguracje.
Podsumowując, `@generateniceMocks` jest ogólnie preferowany ze względu na jego zdolność do uproszczenia kodu testowego i zmniejszenia błędów z powodu nieokreślonych metod, podczas gdy`@generateMocks` zapewnia surowsze podejście, które może być przydatne w określonych scenariuszach, w których wymagana jest jawna kontrola nad zachowaniem mocka [4] [11].
Cytaty:[1] https://www.amaysim.technology/blog/flutter-test-mockleo-generatemocks-vs-generatenicemocks
[2] https://www.reddit.com/r/golang/comments/ua0hps/generated_vs_handwritten_mocks/
[3] https://blog.logreocke.com/unit-testing-flutter-code-mocchito/
[4] https://pub.dev/documentation/mockito/latest/annotations/generatenicemocks-class.html
[5] https://plugins.jetbrains.com/plugin/23513-geneerate-flutter-mocks
[6] https://stackoverflow.com/questions/72390220/flutter-generatemocks-is-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-contains-a-class-him-appears-to-already-be-mocked
[11] https://pub.dev/packages/mockito