1. Información general
Este tutorial ilustra varios usos de los métodos simulados estáticos estándar de la API de Mockito .
Al igual que con otros artículos enfocados en el framework Mockito (como Mockito Verify o Mockito When / Then), la clase MyList que se muestra a continuación se utilizará como colaborador para ser burlado en casos de prueba:
public class MyList extends AbstractList { @Override public String get(int index) { return null; } @Override public int size() { return 1; } }
2. burla simple
La variante sobrecargada más simple del método simulado es la que tiene un solo parámetro para la clase que se va a simular:
public static T mock(Class classToMock)
Usaremos este método para simular una clase y establecer una expectativa:
MyList listMock = mock(MyList.class); when(listMock.add(anyString())).thenReturn(false);
Luego ejecute un método en el simulacro:
boolean added = listMock.add(randomAlphabetic(6));
El siguiente código confirma que el método add se ha invocado en el simulacro y que la invocación devuelve un valor que coincide con la expectativa que establecimos antes:
verify(listMock).add(anyString()); assertThat(added, is(false));
3. Burlarse con el nombre de Mock
En esta sección, cubriremos otra variante del método simulado que se proporciona con un argumento que especifica el nombre del simulacro:
public static T mock(Class classToMock, String name)
En términos generales, el nombre de un simulacro no tiene nada que ver con el código de trabajo, pero puede ser útil cuando se trata de depurar, donde el nombre del simulacro se usa para rastrear errores de verificación.
Para asegurarnos de que el nombre proporcionado de un simulacro esté incluido en el mensaje de una excepción lanzada por una verificación fallida, confiaremos en una implementación JUnit de la interfaz TestRul e, llamada ExpectedException , y la incluiremos en una clase de prueba:
@Rule public ExpectedException thrown = ExpectedException.none();
Esta regla se utilizará para manejar las excepciones generadas por los métodos de prueba.
En el siguiente código, creamos una simulación para la clase MyList y la llamamos myMock :
MyList listMock = mock(MyList.class, "myMock");
Luego, establezca una expectativa en un método del simulacro y ejecútelo:
when(listMock.add(anyString())).thenReturn(false); listMock.add(randomAlphabetic(6));
Crearemos una verificación intencionalmente fallida que debería generar una excepción con el mensaje que contiene información sobre el simulacro. Para hacerlo, es necesario establecer primero las expectativas sobre la excepción:
thrown.expect(TooLittleActualInvocations.class); thrown.expectMessage(containsString("myMock.add"));
La siguiente verificación debería fallar y generar una excepción que coincida con lo esperado:
verify(listMock, times(2)).add(anyString());
Aquí está el mensaje de la excepción lanzada:
org.mockito.exceptions.verification.TooLittleActualInvocations: myMock.add(); Wanted 2 times: at com.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...) but was 1 time: at com.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)
Como podemos ver, el nombre del simulacro se ha incluido en el mensaje de excepción, que será útil para encontrar el punto de falla en caso de una verificación sin éxito.
4. Burlarse con respuesta
Aquí, demostraremos el uso de una variante de simulación en la que la estrategia para las respuestas de la simulación a la interacción se configura en el momento de la creación. La firma de este método simulado en la documentación de Mockito se parece a lo siguiente:
public static T mock(Class classToMock, Answer defaultAnswer)
Comencemos con la definición de una implementación de la interfaz de respuesta :
class CustomAnswer implements Answer { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { return false; } }
La clase CustomAnswer anterior se usa para la generación de un simulacro:
MyList listMock = mock(MyList.class, new CustomAnswer());
Si no establecemos una expectativa en un método, entrará en juego la respuesta predeterminada, que fue configurada por el tipo CustomAnswer . Para probarlo, saltaremos el paso de configuración de expectativas y saltaremos a la ejecución del método:
boolean added = listMock.add(randomAlphabetic(6));
La siguiente verificación y afirmación confirman que el método simulado con un argumento de respuesta ha funcionado como se esperaba:
verify(listMock).add(anyString()); assertThat(added, is(false));
5. Burlarse con MockSettings
El método simulado final que se cubre en este artículo es la variante con un parámetro del tipo MockSettings . Este método sobrecargado se utiliza para proporcionar una simulación no estándar.
Hay varias configuraciones personalizadas que son compatibles con los métodos de la interfaz MockSettings , como registrar un oyente para las invocaciones de métodos en el simulacro actual con invocationListeners , configurar la serialización con serializable , especificar la instancia para espiar con spiedInstance , configurar Mockito para intentar usar un constructor al crear una instancia de un simulacro con useConstructor , y algunos otros.
Para mayor comodidad, reutilizaremos la clase CustomAnswer presentada en la sección anterior para crear una implementación MockSettings que defina una respuesta predeterminada.
Un objeto MockSettings se crea una instancia mediante un método de fábrica de la siguiente manera:
MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer());
Ese objeto de configuración se utilizará en la creación de un nuevo simulacro:
MyList listMock = mock(MyList.class, customSettings);
De manera similar a la sección anterior, invocaremos el método add de una instancia de MyList y verificaremos que un método simulado con un argumento MockSettings funcione como se supone que debe hacerlo mediante el siguiente fragmento de código:
boolean added = listMock.add(randomAlphabetic(6)); verify(listMock).add(anyString()); assertThat(added, is(false));
6. Conclusión
Este tutorial ha cubierto el método simulado de Mockito en detalle. La implementación de estos ejemplos y fragmentos de código se puede encontrar en un proyecto de GitHub.