4.1 Parâmetros do método

As regras anteriores adicionadas ao objeto fictício tratavam de métodos sem parâmetros. E como criar regras para métodos com parâmetros? Além disso, gostaria de criar regras para que, para alguns valores de parâmetros, haja um resultado e para outros - outro.

É assim que você também pode fazer. Se você deseja que o método retorne algo específico com um determinado parâmetro, a regra pode ser escrita assim:

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

Vamos dar uma olhada em um exemplo para entender melhor. Deixe nossa Lista retornar o nome Ivan ao solicitar o 10º elemento e o nome Marya ao solicitar o 500º. Dito e feito.

@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 Modelos de Parâmetros

E imediatamente colegas astutos me farão a pergunta: “E se o método exigir argumentos, mas para qualquer valor ele deve retornar o mesmo resultado?”. Não vamos escrever:

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

Não, ninguém está te obrigando a escrever assim. Se você quiser adicionar uma regra a um objeto fictício que funcione para um método com qualquer argumento, existe um objeto especial para isso:

Mockito.any()

Nosso exemplo com ele seria escrito assim:

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

Existem algumas nuances aqui. O objeto Mockito.any()tem type Object, então existem análogos para parâmetros de diferentes tipos:

Método Tipo de parâmetro
1 qualquer() Objeto incluindo nulo
2 any(ClassName.class) nome da classe
3 qualquerInt() int
4 qualquerBooleano() boleano
5 qualquerDuplo() dobro
6 qualquerLista() Lista

Mais corretamente, nosso exemplo ficaria assim:

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

4.3 método doAnswer()

Chegamos ao comportamento complexo dos métodos virtuais. Mais cedo ou mais tarde, haverá uma situação em que você deseja que esse método virtual tenha um comportamento complexo. Por exemplo, deve retornar valores dependendo dos parâmetros, converter a string para maiúscula.

Existe um método especial para isso - doAnswer(), que recebe uma função que faz o que você precisa:

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

Vamos fazer o método get()da classe Listretornar o quadrado do argumento passado para ela. E escreva o seguinte 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 a função usando um objeto da classe Answer.