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 importent peu ou n'informent pas ?
Exemple : enregistrement dans une base 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 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)
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);
}
}
}
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);
}
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;
@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éé é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.
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 messagesverify(infoStore, times(3)).save("[INFO] Processing data...");
Introduction aux tests en Java