Introduction aux tests en Java
Maria Milusheva
Senior Software Engineer
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 sont peu utiles ou non parlantes ?
Exemple : sauvegarde dans une base de données.

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

Les serveurs de bases de données sont durables, sûrs, fiables et quasi illimités
Les vraies bases sont trop grandes et complexes pour les tests unitaires (mais adaptées aux tests d'intégration)
Supposons que nous traitions des 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);
}
}
}
Seules des interfaces simples suffisent 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);
}
Comment tester qu'un message a été sauvegardé sans créer de bases de données ?
Vérifier qu'un mock a été utilisé :
import static org.mockito.Mockito.verify;
Vérifier qu'un mock n'a pas été utilisé :
import static org.mockito.Mockito.verifyNoInteractions;
@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); }
Et si le message créé est plutôt :
String message = "[ERROR] Process failed!"
Alors on verra des erreurs de test comme :
Wanted but not invoked:
infoStore.save("[ERROR] Process failed!");
Actually, there were zero interactions with this mock.
Nous pouvons vérifier le nombre exact d'invocations d'un log :
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 messagesverify(infoStore, times(3)).save("[INFO] Processing data...");
Introduction aux tests en Java