iberck
9/9/2015 - 4:45 PM

Mock objects

Mock objects

Mock objects

Son objetos que sirven para simular dependencias (base de datos, servicio, webservice, objetos de dominio, controladores, vistas, etc.)

Se usan para poder hacer unit testing de manera aislada y quitar las dependencias que tenga el objeto.

Un punto importante al momento de programar es que los MockObjects deben implementar la misma interfaz que el objeto que se están simulando para poder testear en base a interfaces.

Si no existieran los mock objects la forma manual de programar sería crear un stub (implementar la interfaz y definir sus métodos retornando valores esperados). Sin embargo los frameworks para testing (p.e. Mockito) permiten definir el comportamiento del objeto de una manera simple (y sin definir una clase que implemente una interfaz) y agrega métodos de utilería (validar el número de llamadas de un método, lanzar excepciones, validar el orden, ...).

Stubbing

Un stub es un trozo de código que simula el comportamiento de piezas de software.

En la práctica es definir por ejemplo un método con la firma correcta pero que solo devuelve una constante (permite avanzar en otras piezas de software):

boolean isUserNameUnique(String username) {
    // TODO: implementar funcionalidad
    return true
}

El siguiente ejemplo indica que el método tieneAccesoContrato retornará siempre false sin importar los argumentos que se envíen:

accesoServiceMock.tieneAccesoContrato(_) >> false

Un mock object no necesita realizar procesamientos, simplemente regresar los valores correctos (stubbing), para ello se programa el comportamiento de los mocks indicando qué deben devolver ciertos métodos:

//stubbing
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenThrow(new RuntimeException());
 
//imprime "first"
System.out.println(mockedList.get(0));
 
//lanza runtime exception
System.out.println(mockedList.get(1));

Por defecto todos los métodos que devuelven valores de un mock devuelven null, una colección vacía o el tipo de dato primitivo apropiado.