1
resposta

[Sugestão] Sugestão de crição de testes utilizando as anotações do Mockito

Já tenho uma pequena experiência com testes unitários e só gostaria compartilhar com os colegas a possibilidade de utilizar as anotações do Mockito para criar os mocks, que ficam um pouquinho mais enxutos, o que ajuda bastante, principalmente em grandes classes de teste.

Breve explicação: para que as anotações funcionem é necessário "dizer" para o Mockito que irá utilizá-las. E isso é feito através do código.

    public void setUp() {
         MockitoAnnotations.openMocks(this);
    }

A anotação @BeforeEach é do JUnit e faz com que tudo que está escrito no método que a recebe seja executado antes de cada teste.

A classe ficou assim:

class AbrigoServiceTest {

    @Mock
    private ClientHttpConfiguration client;

    @InjectMocks
    private AbrigoService abrigoService;

    @Mock
    private HttpResponse<String> response;

    private final Abrigo abrigo = new Abrigo("Teste", "61981880392", "abrigo_alura@gmail.com");

    @BeforeEach
    public void setUp() {
         MockitoAnnotations.openMocks(this);
    }

    @Test
    void deveVerificarSeDispararRequisicaoGetSeraChamado() throws IOException, InterruptedException {
        abrigo.setId(0L);
        String expectedAbrigosCadastrados = "Abrigos cadastrados:";
        String expectedIdENome = "0 - Teste";

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        PrintStream printStream = new PrintStream(byteArrayOutputStream);
        System.setOut(printStream);

        when(response.body()).thenReturn("[{" + abrigo.toString() + "}]");
        when(client.dispararRequisicaoGet(anyString())).thenReturn(response);

        abrigoService.listarAbrigo();

        String[] lines = byteArrayOutputStream.toString().split(System.lineSeparator());
        String actualAbrigosCadastrados = lines[0];
        String actualIdENome = lines[1];

        Assertions.assertEquals(expectedAbrigosCadastrados, actualAbrigosCadastrados);
        Assertions.assertEquals(expectedIdENome, actualIdENome);
    }

}

O @Mock cria objetos mocados do mesmo tipo que o campo que está em cima; O@InjectMocks cria uma instância do objeto em que está em cima, já inserindo os mocks que o objeto necessita.

1 resposta

Olá, Victor, tudo bem?

Que ótima contribuição você trouxe para o fórum!

A utilização das anotações do Mockito realmente pode tornar o código de teste mais limpo e fácil de entender, principalmente em testes maiores. Sua explicação está muito clara e acredito que será de grande ajuda para os colegas que estão aprendendo sobre testes unitários com Mockito.

Victor, continue assim que você vai longe!

Qualquer dúvida, compartilhe no fórum.

Abraços e bons estudos!