Verificação em mocking

Introdução a Testes em Java

Maria Milusheva

Senior Software Engineer

Motivação: Sem valores de retorno

Na lição anterior e nos exercícios, testamos verificando valores de retorno.

  • Mas e se não houver valores de retorno?

  • E se os retornos não forem importantes ou informativos?

Exemplo: salvar em um banco de dados.

Gráfico de um banco de dados com arquivos sendo salvos

Introdução a Testes em Java

Exemplo: Bancos de dados

Banco de dados — um repositório digital para armazenar, gerenciar e proteger coleções organizadas de dados. Há muitos provedores de banco de dados: Os logotipos de alguns bancos de dados populares

  • Servidores de banco de dados são duráveis, seguros, confiáveis e têm capacidade virtualmente ilimitada

  • Bancos reais são grandes e complexos para testes de unidade (mas podem ser usados em testes de integração)

Introdução a Testes em Java

Exemplo: Mensagens de log

Suponha que estamos processando logs:

public class MessageProcessor {
    private InfoStore infoStore;  // Will store info log messages here
    private ErrorStore errorStore; // Will store error log messages here

    public void saveMessage(String message) {
        if (message.startsWith("[INFO]")) {
            infoStore.save(message);
        }
        if (message.startsWith("[ERROR]")) {
            errorStore.save(message);
        }
    }
}
Introdução a Testes em Java

InfoStore e ErrorStore

Só precisamos de interfaces básicas para o teste funcionar:

// Blueprints for InfoStore and ErrorStore
// Mocks don't need the mocked classes to be properly implemented
interface InfoStore {
    void save(String message);
}

interface ErrorStore {
    void save(String message);
}
Introdução a Testes em Java

Mockito verify

Como testar que uma mensagem foi salva sem criar bancos de dados?

Verifique se um mock foi usado:

import static org.mockito.Mockito.verify;

Verifique se um mock não foi usado:

import static org.mockito.Mockito.verifyNoInteractions;
Introdução a Testes em Java

Configuração do teste

@Test
void process_savesToInfoStore_whenInfoMessage() {
  InfoStore infoStore = mock(InfoStore.class);
  ErrorStore errorStore = mock(ErrorStore.class);
  MessageProcessor messageProcessor = new MessageProcessor(infoStore, errorStore);

String message = "[INFO] Process started."; messageProcessor.saveMessage(message); // Will use either InfoStore or ErrorStore
// Verify which one of the two databases was used verify(infoStore).save(message); verifyNoInteractions(errorStore); }
Introdução a Testes em Java

Mensagens de falha de teste

E se a mensagem criada for:

String message = "[ERROR] Process failed!"

Então veremos falhas de teste como esta:

Wanted but not invoked:
infoStore.save("[ERROR] Process failed!");
Actually, there were zero interactions with this mock.
Introdução a Testes em Java

Mais formas de verificação

Podemos verificar exatamente quantas vezes um log foi chamado:

import static org.mockito.Mockito.times;
List<String> messages = new ArrayList<>(); // Create list and add elements
                messages.add("[INFO] Processing data...");
                messages.add("[INFO] Processing data...");
                messages.add("[INFO] Processing data...");

messageProcessor.saveMessageList(messages); // Save the three messages


verify(infoStore, times(3)).save("[INFO] Processing data...");
Introdução a Testes em Java

Vamos praticar!

Introdução a Testes em Java

Preparing Video For Download...