Las anotaciones `@Generatemocks` y`@GeneratenicEmocks` en Mockito se utilizan para generar clases simuladas para pruebas unitarias en aplicaciones DART y Flutter. Si bien ambas anotaciones tienen el mismo propósito primario, difieren significativamente en su comportamiento al manejar llamadas de métodos no estados.
@Generatemocks
- Comportamiento para los métodos no estuezados: cuando se llama a un método en un objeto simulado generado con `@generatemocks` y no se ha definido un trozo para ese método, Mockito lanzará una excepción. Este comportamiento asegura que defina explícitamente los trozos de todos los métodos que se espera que se llamen durante una prueba, lo que ayuda a captar supervisiones potenciales en la configuración de la prueba.
- Uso: esta anotación se usa típicamente cuando desea un control estricto sobre el comportamiento de sus simulacros, asegurando que cualquier llamadas de método inesperado se marque inmediatamente como errores.
- Estado de deprecación: `@Generatemocks` se considera menos recomendado en comparación con`@Generatenicemocks` debido a su comportamiento estricto, lo que puede conducir a un código de prueba más detallado si no se maneja cuidadosamente.
@Generatenicemocks
- Comportamiento para los métodos no estados: en contraste, los simulacros generados con `@generatenicemocks` devolverán un valor legal predeterminado para el tipo de retorno del método cuando se llama a un método no estancado. Este valor predeterminado no está destinado a su uso en la lógica de prueba, pero sirve para evitar errores de tiempo de ejecución debido a los valores nulos o faltantes.
- Uso: se recomienda esta anotación para la mayoría de los casos de uso porque simplifica la redacción de pruebas al reducir la necesidad de agitar cada llamada de método posible. Hace que las pruebas sean más robustas evitando fallas debido a los talones olvidados.
- Características adicionales: `@Generatenicemocks` solo permite 'Mockspec' en su lista de argumentos, proporcionando más flexibilidad para personalizar las clases simuladas generadas. Por ejemplo, puede especificar un nombre personalizado para la clase simulada utilizando el parámetro `as` en` mockspec`.
Diferencias clave
1. Manejo de métodos no esterados: la diferencia más significativa es cómo cada anotación maneja el método llama sin trozos explícitos. `@Generatemocks` lanza una excepción, mientras que`@Generatenicemocks` devuelve un valor predeterminado.
2. Código de simplicidad y robustez: `@Generatenicemocks` generalmente conduce a un código de prueba más simple y más robusto al reducir la necesidad de retrasos exhaustivos.
3. Personalización: `@Generatenicemocks` ofrece más opciones de personalización a través de` MockSpec`, permitiendo nombres de clases simulados personalizados y otras configuraciones avanzadas.
En resumen, `@generatenicemocks` generalmente se prefiere por su capacidad para simplificar el código de prueba y reducir los errores debido a los métodos no estancados, mientras que`@generatemocks` proporciona un enfoque más estricto que puede ser útil en escenarios específicos donde se requiere un control explícito sobre el comportamiento simulado [1] [4] [11].
Citas:[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-flutter-code-mockito/
[4] https://pub.dev/documentation/mockito/latest/annotations/generatenicemocks-class.html
[5] https://plugins.jetbrains.com/plugin/23513-generate-flutter-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-contains-a-class-awhich-apears-to-already-be-mocked
[11] https://pub.dev/packages/mockito