Vérification avec les simulacres

Introduction aux tests en Java

Maria Milusheva

Senior Software Engineer

Motivation : aucune valeur de retour

Dans la leçon précédente et ses exercices, nous testions en vérifiant les valeurs de retour.

  • Mais s'il n'y a aucune valeur de retour ?

  • Et si les valeurs de retour importent peu ou n'informent pas ?

Exemple : enregistrement dans une base de données.

Graphique d'une base de données où des fichiers sont enregistrés

Introduction aux tests en Java

Exemple : bases de données

Base de données – dépôt numérique pour stocker, gérer et sécuriser des ensembles de données organisés. Il existe de nombreux fournisseurs : Les logos de bases de données populaires

  • Les serveurs de bases de données sont durables, sécurisés, fiables et presque sans limite de capacité

  • Les vraies bases de données sont trop grandes et complexes pour les tests unitaires (mais utiles en tests d'intégration)

Introduction aux tests en Java

Exemple : messages de journal

Supposons que nous traitions des journaux :

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);
        }
    }
}
Introduction aux tests en Java

InfoStore et ErrorStore

Il suffit d'interfaces de base pour que le test fonctionne :

// 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);
}
Introduction aux tests en Java

Mockito verify

Comment tester qu'un message a été enregistré sans créer de bases de données ?

Vérifier qu'un simulacre a été utilisé :

import static org.mockito.Mockito.verify;

Vérifier qu'un simulacre n'a pas été utilisé :

import static org.mockito.Mockito.verifyNoInteractions;
Introduction aux tests en Java

Configuration du test

@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); }
Introduction aux tests en Java

Messages d'échec de test

Et si le message créé était plutôt :

String message = "[ERROR] Process failed!"

Vous verriez alors des échecs de test comme ceci :

Wanted but not invoked:
infoStore.save("[ERROR] Process failed!");
Actually, there were zero interactions with this mock.
Introduction aux tests en Java

Astuces de vérification supplémentaires

Nous pouvons vérifier exactement combien de fois un journal a été invoqué :

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...");
Introduction aux tests en Java

Passons à la pratique !

Introduction aux tests en Java

Preparing Video For Download...