mocks mock and unit-testing tdd mocking easymock stubs

unit-testing - and - mockito



¿Por qué necesitamos marcos de burla como Easymock, JMock o Mockito? (5)

Usamos stubs escritos a mano en nuestras pruebas unitarias y estoy explorando la necesidad de un framework Mock como EasyMock o Mockito en nuestro proyecto.

No encuentro un motivo convincente para cambiar a marcos de burla de trozos escritos a mano.

¿Alguien puede responder por qué uno optaría por marcos burlones cuando ya están haciendo pruebas unitarias usando mocks / stubs escritos a mano.

Gracias


A veces puede ser más fácil crear burlas de manera declarativa y puede ayudarte a escribir algunos tipos de comportamientos más fácilmente usando el marco que a mano. Otra pequeña ventaja podría ser también que al usar el marco de burla estás siendo explícito sobre la burla.


Al igual que cualquier otro desarrollador, me encuentro escribiendo código en lugar de usar la solución existente, el síndrome "no inventado aquí".

Su pregunta sugiere que prefiere escribir las clases que necesita para simular / simular dos veces en lugar de utilizar un marco que lo haga por usted. El uso de un marco de burla lo libera de la necesidad de escribir, refactorizar y actualizar sus burlas hechas a mano siempre que cambie el objeto falso.

En otras palabras, usar un marco de burla es como cualquier otra biblioteca de terceros, por ejemplo, ORM: alguien más escribió el código para que no sea necesario.


Empecé de la misma manera (escribiendo burlas a mano) y ahora casi me he cambiado a EasyMock.

Encuentro que usar EasyMock suele ser más rápido y más flexible.

Normalmente, la primera vez que necesito un simulacro, puedo tenerlo en un par de líneas de código con EasyMock, mientras que a mano necesito implementar la interfaz necesaria (lo suficiente, esto puede ser generado por un IDE como IntelliJ) y luego agregue el código necesario para producir la respuesta necesaria y / o permita detectar los efectos de las llamadas a ella.

Bien, uno podría decir que es un costo único por única vez. La próxima vez que pueda reutilizar la mano escrita se burlan felizmente ... descubrí que a menudo ese no es el caso. En otra prueba, podría necesitar un simulacro de la misma clase con un comportamiento diferente. Por ejemplo, se llaman diferentes métodos y se espera un resultado diferente. Un caso específico es cuando se espera que el simulacro arroje una excepción en un caso de prueba, pero no en otro. Bien, puedo agregarle algunos parámetros que controlan el comportamiento de forma dinámica. Luego, para la próxima prueba, algunos parámetros más para controlar más el comportamiento ... así que termino con una implementación simulada cada vez más complicada, que es una dependencia para cada vez más pruebas unitarias, planteando también el riesgo de romper inadvertidamente las pruebas anteriores.

A diferencia de esto, con EasyMock puedo configurar mis burlas de forma independiente para cada prueba. Por lo tanto, el comportamiento está explícitamente controlado y visible dentro del código de la prueba unitaria, y no hay riesgo de efectos secundarios.

Sin mencionar que con EasyMock puede verificar que se llamen los métodos requeridos en el orden requerido, si es necesario (y lo hago, de vez en cuando). Implementar esto a mano (especialmente de forma genérica) sería bastante doloroso para el cuello, sin ningún beneficio adicional.


Es posible que desee leer el artículo de Mocks Are not Stubs de Martin Fowler. La diferencia básica es esta:

  • El trabajo de un stub es devolver resultados conocidos a todas las llamadas
  • Un simulacro también espera que las llamadas lleguen en un orden específico, con parámetros específicos, y emitirá una excepción cuando no se cumplan estas expectativas.

Hay algunas condiciones de error que no se pueden probar con stubs. Por otro lado, las pruebas que utilizan burlas a menudo son mucho menos estables.

Mientras que los resguardos se pueden escribir manualmente con un esfuerzo razonable, Mocks requeriría mucho más trabajo. Y un buen marco de burla también puede hacer que los talones de escritura sean más rápidos y fáciles.


La respuesta simple es que no los necesitamos.

Tampoco necesitamos otros marcos existentes, pero el uso de frameworks de Mocking hace nuestras vidas más fáciles . Como desarrolladores, podemos dedicar más tiempo al problema en cuestión, en lugar de crear o llevar a cabo lo que pueden hacer los marcos de burla.

" No encuentro un motivo convincente para cambiar a marcos de burla de trozos escritos a mano ".

Yo era exactamente lo mismo. ¿Por qué debería molestarme en aprender un marco de burla? Los talones escritos a mano están bien.

Me vienen a la mente algunos puntos, principalmente el hecho de que después de un tiempo tus pruebas se vuelven oscuras con los trozos de prueba. A lo que se refiere cuando usa stubs escritos a mano se lo conoce como extensiones de prueba. Extiende el código para habilitar lo que hacen los marcos de burla. En otras palabras, escribe código en stub o devuelve valores según lo que ocurra. Esto requiere tiempo y esfuerzo. Sin mencionar el espacio. Un marco burlón puede hacer todo esto en cuestión de líneas.

Los beneficios de un marco de burla son:

  • Más fácil ( subjetivo, pero después de un tiempo no escribirás implementaciones escritas a mano )
  • Menos código (los marcos te permiten crear un simulacro en cuestión de líneas, en lugar de declaraciones de clase completa )
  • Sigue DRY ( no terminarás repitiendo implementaciones simuladas )

El mayor beneficio se obtiene cuando necesita objetos simulados. Tener que escribir código a mano para verificar si se llamó a un método, cuántas veces, etc. es una mini tarea en sí misma. Si alguien más lo ha hecho, y ha creado un marco bien probado y bien probado, no tendría sentido no usarlo. Al igual que cualquier marco, puede ir bien sin él, pero a veces con la herramienta adecuada hace que el trabajo sea mucho más fácil.