Tests et intégration
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 83 sur 87.
Défi
FacileFélicitations pour la construction de votre système de gestion de bibliothèque ! Il est temps de tout rassembler et de vérifier que tous les composants fonctionnent correctement en tant que système intégré. Vous allez créer un scénario de test complet qui exerce toutes les fonctionnalités que vous avez développées tout au long de ce projet.
Vous travaillerez avec les sept fichiers de votre système terminé :
Book.java: Votre classe Book avec isbn, title, author, isAvailable, borrowedBy, et toutes les méthodes associées, y comprisgetDetails().User.java: Votre classe User avec id, name, la liste borrowedBooks, et les méthodes pour emprunter/retourner des livres.LibraryException.java: Votre classe d'exception personnalisée de base.BookNotAvailableException.java: Votre exception pour les livres non disponibles.LibraryAdmin.java: Votre interface d'administration et l'implémentation AdminService.Library.java: Votre classe Library complète avec toutes les méthodes — ajout/suppression de livres, enregistrement des utilisateurs, emprunt/retour, recherche et gestion des exceptions.Main.java: Votre test d'intégration qui démontrera l'ensemble du système fonctionnant de concert.
Dans votre classe Main, vous traiterez une série de commandes qui testent chaque fonctionnalité majeure de votre système de bibliothèque. Les commandes arrivent sous la forme d'une seule chaîne de caractères séparée par des virgules avec ces formats :
ADD_BOOK:isbn:title:author- Ajouter un livre via AdminServiceREGISTER_USER:id:name- Enregistrer un utilisateur via AdminServiceBORROW:userId:isbn- Emprunter un livre (avec gestion des exceptions)RETURN:userId:isbn- Retourner un livreSEARCH_TITLE:keyword- Rechercher des livres par titreSEARCH_AUTHOR:keyword- Rechercher des livres par auteurREMOVE_BOOK:isbn- Supprimer un livre via AdminService
Traitez chaque commande et affichez la sortie appropriée :
- ADD_BOOK :
Added: [title] - REGISTER_USER :
Registered: [name] - BORROW : Affichez le message de succès ou
Error: [exception message] - RETURN :
[userName] returned [bookTitle] - SEARCH_TITLE : Affichez
Search '[keyword]':suivi des détails de chaque livre correspondant, ouNo results - SEARCH_AUTHOR : Même format que la recherche par titre
- REMOVE_BOOK :
Removed: [isbn]ouCannot remove: [isbn]
Après toutes les commandes, affichez un résumé final :
--- Final Status ---Books: [count]Users: [count]- Pour chaque utilisateur, affichez
[name]: [borrowedCount] book(s)
Vous recevrez une seule entrée : la chaîne de commandes séparée par des virgules.
Par exemple, avec l'entrée ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Effective Java:Joshua Bloch,REGISTER_USER:U001:Alice,REGISTER_USER:U002:Bob,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001,SEARCH_TITLE:java,RETURN:U001:ISBN-001,REMOVE_BOOK:ISBN-001, votre sortie serait :
Added: Clean Code
Added: Effective Java
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Search 'java':
[ISBN-002] Effective Java by Joshua Bloch
Alice returned Clean Code
Removed: ISBN-001
--- Final Status ---
Books: 1
Users: 2
Alice: 0 book(s)
Bob: 0 book(s)Ce défi final valide que tous vos composants — classes, interfaces, exceptions et la logique de la bibliothèque — fonctionnent ensemble de manière transparente. Vous avez construit un système de gestion de bibliothèque complet et robuste !
Essayez vous-même
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les commandes séparées par des virgules
String input = scanner.nextLine();
String[] commands = input.split(",");
// Créer Library et AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Traiter chaque commande
for (String command : commands) {
String[] parts = command.split(":");
String operation = parts[0];
if (operation.equals("ADD_BOOK")) {
String isbn = parts[1];
String title = parts[2];
String author = parts[3];
if (adminService.addBook(isbn, title, author)) {
System.out.println("Added: " + title);
}
} else if (operation.equals("REMOVE_BOOK")) {
String isbn = parts[1];
if (adminService.removeBook(isbn)) {
System.out.println("Removed: " + isbn);
} else {
System.out.println("Cannot remove: " + isbn);
}
} else if (operation.equals("REGISTER_USER")) {
String id = parts[1];
String name = parts[2];
if (adminService.registerUser(id, name)) {
System.out.println("Registered: " + name);
}
} else if (operation.equals("BORROW")) {
String userId = parts[1];
String isbn = parts[2];
try {
String result = library.borrowBook(userId, isbn);
System.out.println(result);
} catch (LibraryException e) {
System.out.println("Error: " + e.getMessage());
}
}
// TODO: Ajouter la gestion de la commande RETURN
// TODO: Ajouter la gestion de la commande SEARCH_TITLE
// TODO: Ajouter la gestion de la commande SEARCH_AUTHOR
}
// TODO: Afficher le statut final
// --- Statut final ---
// Livres : [count]
// Utilisateurs : [count]
// Pour chaque utilisateur : [name] : [borrowedCount] livre(s)
System.out.println("Operations completed");
}
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé10Gestion des exceptions en POO
Hiérarchie des classes d'exceptionExceptions personnaliséesErreurs Checked vs UncheckedPattern Try-with-resourcesRécapitulatif - Utilisateur validé13Projet : Gestion de bibliothèque
Présentation du projet et conception UMLClasses Livre et Utilisateur2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron Itérateur