4.1 Parámetros del método

Las reglas anteriores añadidas al objeto simulado se ocupaban de métodos sin parámetros. ¿Y cómo crear reglas para métodos con parámetros? Además, me gustaría crear reglas para que para algunos valores de parámetros haya un resultado y para otros, otro.

Así es como tú también puedes hacerlo. Si desea que el método devuelva algo específico con un determinado parámetro, la regla se puede escribir así:

Mockito.doReturn(result).when(an object).method name(parameter);

Veamos un ejemplo para entender mejor. Deje que nuestra Lista devuelva el nombre Ivan cuando solicite el elemento 10 y el nombre Marya cuando solicite el 500. Dicho y hecho.

@ExtendWith(MockitoExtension.class)
class ParamsTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        //adding the first rule
        Mockito.doReturn("Ivan").when(mockList).get(10);
        //adding a second rule
        Mockito.doReturn("Maria").when(mockList).get(500);

        assertEquals("Ivan", mockList.get(10));
        assertEquals("Maria", mockList.get(500));

    }
}

4.2 Plantillas de parámetros

E inmediatamente, los colegas astutos me harán la pregunta: "¿Qué pasa si el método requiere argumentos, pero para cualquier valor debe devolver el mismo resultado?". No escribamos:

Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);

No, nadie te obliga a escribir así. Si desea agregar una regla a un objeto simulado que funcione para un método con cualquier argumento, entonces hay un objeto especial para esto:

Mockito.any()

Nuestro ejemplo con él se escribiría así:

Mockito.doReturn("Ivan").when(mockList).get(any(int.class));

Hay un par de matices aquí. El objeto Mockito.any()tiene tipo Object, por lo que hay análogos para parámetros de diferentes tipos:

Método Tipo de parámetro
1 cualquier() Objeto incluyendo nulo
2 cualquiera (NombreClase.clase) nombre de la clase
3 cualquierInt() En t
4 cualquierBooleano() booleano
5 cualquierDoble() doble
6 cualquierLista() Lista

Más correctamente, nuestro ejemplo se vería así:

Mockito.doReturn("Ivan").when(mockList).get(anyInt());

4.3 método doAnswer()

Llegamos al complejo comportamiento de los métodos virtuales. Tarde o temprano habrá una situación en la que desee que este método virtual tenga un comportamiento complejo. Por ejemplo, debería devolver valores dependiendo de los parámetros, convertir la cadena a mayúsculas.

Hay un método especial para esto doAnswer(), al que se le pasa una función que hace lo que necesita:

Mockito.doAnswer(function).when(an object).method name(parameter);

Hagamos que el método get()de clase Listdevuelva el cuadrado del argumento que se le pasó. Y escribe el siguiente programa:

@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        Mockito.doAnswer(invocation -> {
            int parameter = invocation.getArgument(0);
            return parameter * parameter;
        }).when(mockList).get(anyInt());

        assertEquals(100, mockList.get(10));
        assertEquals(25, mockList.get(5));
    }
}

Definimos la función usando un objeto de la clase Respuesta.