Testen und Integration
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 83 von 87.
Aufgabe
EinfachHerzlichen Glückwunsch zum Aufbau Ihres Bibliotheksverwaltungssystems! Es ist an der Zeit, alles zusammenzuführen und zu verifizieren, dass alle Komponenten als integriertes System korrekt funktionieren. Sie werden ein umfassendes Testszenario erstellen, das alle Funktionen nutzt, die Sie im Laufe dieses Projekts entwickelt haben.
Sie werden mit allen sieben Dateien aus Ihrem fertigen System arbeiten:
Book.java: Ihre Book-Klasse mit isbn, title, author, isAvailable, borrowedBy und allen zugehörigen Methoden einschließlichgetDetails().User.java: Ihre User-Klasse mit id, name, der Liste borrowedBooks und Methoden zum Ausleihen/Zurückgeben von Büchern.LibraryException.java: Ihre benutzerdefinierte Basis-Exception-Klasse.BookNotAvailableException.java: Ihre Exception für nicht verfügbare Bücher.LibraryAdmin.java: Ihr Admin-Interface und die AdminService-Implementierung.Library.java: Ihre vollständige Library-Klasse mit allen Methoden – Hinzufügen/Entfernen von Büchern, Registrieren von Benutzern, Ausleihen/Zurückgeben, Suchen und Exception-Handling.Main.java: Ihr Integrationstest, der das gesamte System im Zusammenspiel demonstriert.
In Ihrer Main-Klasse werden Sie eine Reihe von Befehlen verarbeiten, die jede wichtige Funktion Ihres Bibliothekssystems testen. Die Befehle werden als ein einziger, durch Kommas getrennter String in diesen Formaten übergeben:
ADD_BOOK:isbn:title:author- Ein Buch über den AdminService hinzufügenREGISTER_USER:id:name- Einen Benutzer über den AdminService registrierenBORROW:userId:isbn- Ein Buch ausleihen (mit Exception-Handling)RETURN:userId:isbn- Ein Buch zurückgebenSEARCH_TITLE:keyword- Bücher nach Titel suchenSEARCH_AUTHOR:keyword- Bücher nach Autor suchenREMOVE_BOOK:isbn- Ein Buch über den AdminService entfernen
Verarbeiten Sie jeden Befehl und geben Sie die entsprechende Meldung aus:
- ADD_BOOK:
Added: [title] - REGISTER_USER:
Registered: [name] - BORROW: Geben Sie die Erfolgsmeldung oder
Error: [exception message]aus - RETURN:
[userName] returned [bookTitle] - SEARCH_TITLE: Geben Sie
Search '[keyword]':gefolgt von den Details jedes passenden Buches aus, oderNo results - SEARCH_AUTHOR: Gleiches Format wie die Titelsuche
- REMOVE_BOOK:
Removed: [isbn]oderCannot remove: [isbn]
Geben Sie nach allen Befehlen eine abschließende Zusammenfassung aus:
--- Final Status ---Books: [count]Users: [count]- Geben Sie für jeden Benutzer
[name]: [borrowedCount] book(s)aus
Sie erhalten eine Eingabe: den durch Kommas getrennten Befehls-String.
Zum Beispiel würde bei der Eingabe 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 Ihre Ausgabe wie folgt aussehen:
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)Diese abschließende Herausforderung bestätigt, dass alle Ihre Komponenten – Klassen, Interfaces, Exceptions und die Bibliothekslogik – nahtlos zusammenarbeiten. Sie haben ein vollständiges, robustes Bibliotheksverwaltungssystem aufgebaut!
Probier es selbst
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Liest die durch Kommas getrennten Befehle
String input = scanner.nextLine();
String[] commands = input.split(",");
// Erstelle Library und AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Verarbeite jeden Befehl
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: Verarbeitung für RETURN-Befehl hinzufügen
// TODO: Verarbeitung für SEARCH_TITLE-Befehl hinzufügen
// TODO: Verarbeitung für SEARCH_AUTHOR-Befehl hinzufügen
}
// TODO: Finalen Status ausgeben
// --- Finaler Status ---
// Bücher: [count]
// Benutzer: [count]
// Für jeden Benutzer: [name]: [borrowedCount] Buch/Bücher
System.out.println("Operations completed");
}
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren10Ausnahmebehandlung in OOP
Exception-KlassenhierarchieBenutzerdefinierte ExceptionsChecked vs. Unchecked ErrorsTry-With-Resources-PatternRecap – Validierter Benutzer13Projekt: Bibliotheksverwaltung
Projektübersicht & UML-DesignBuch- und Benutzerklassen2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem