lunes, abril 06, 2015

Mocking

El Mocking es el proceso de emular el comportamiento de objetos mediante la utilización de mocks.

¿Que es un mock?


Los mocks son objetos que simulan comportamientos de manera controlada.
Son utilizados en las pruebas unitarias para no depender de los resultados de otros objetos que puedan realizar procesamientos complejos.



¿Cómo integrar los mocks en las pruebas unitarias?


Inyección de Dependencias 
Inyección de Dependencias (DI)
La manera más sencilla para integrar los mocks en las pruebas unitarias es mediante el uso de inyección de dependencias (DI), este patrón de la programación orientada a objetos  permite delegar la responsabilidad de instanciar las clases que contiene un objeto.

Uno de los requisitos principales dentro de las pruebas unitarias y la utilización de mocks, es la implementación de interfaces en el código, las cuales permiten tener estructuras polimórficas que brindan mayor flexibilidad en la implementación.

Al utilizar la  DI, se puede suministrar los mocks a las clase que contiene el código a probar, además al implementar interfaces se podrán definir comportamientos según los escenarios de las pruebas.




¿Cómo crear un mock?

Los mocks se podrían crear de manera manual, no obstante esto implicaría definir distintas clases que implementen nuestra interface a moquear, según los distintos comportamientos que se quieran simular, por eso a continuación se mencionan algunos frameworks para crear mocks.


  • Java
    • Mockito 
    • JMock 
    • EasyMock
  • C#
    • Moq
    • Rhino Mocks
  • JavaScript
    • MockusJS
  • Python
    • Mock for Python 3.0


El siguiente ejemplo muestra como se define un mock y el comportamiento a realizar cuando sea llamado desde el método a ser probado.

Test Unitario con Mock

En la imagen se observa como se implementa un test unitario para la clase Vehículo específicamente al método GetAceleracionDePedal. 

Lo primero a realizar en el test es la definición de variables, tanto la del mock, como la de la clase a probar, seguidamente se hace la definición del método, en el cual se instancia el mock y la clase Vehículo, ademas de realizar la inyección de dependencia del mock de la interfaz IMotor,  para luego llamar el método a probar.

El mock para este ejemplo es muy sencillo, consiste en realizar un Setup del método a moquear  y definir el dato que debe retorna, en caso que el método recibiera parámetros, deben ser suministrados en el Setup del método.

Mock sin parámetros de entra


Se debe tener claro que cuando en el Setup se definen unos parámetros de entrada, si estos no concuerdan al momento de ejecutar el método, el test fallara, para evitar esto los frameworks ofrecen utilidades que solo verifican que el parámetro de entrada sea del mismo tipo que el esperado, sin importar el valor.

Mock con parámetros de entrada
No hay comentarios.: