テストと統合
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 83/87。
チャレンジ
簡単Library Management System の構築、おめでとうございます!ここで、すべてをまとめ、統合されたシステムとしてすべてのコンポーネントが正しく動作することを確認しましょう。このプロジェクト全体を通して構築してきたすべての機能を実行する、包括的なテストシナリオを作成します。
完成したシステムの7つのファイルすべてを使用します。
Book.java:isbn、title、author、isAvailable、borrowedBy、およびgetDetails()を含む関連するすべてのメソッドを備えた Book クラスです。User.java:id、name、borrowedBooks リスト、および本の貸し出し・返却用メソッドを備えた User クラスです。LibraryException.java:基底となるカスタム例外クラスです。BookNotAvailableException.java:利用できない本のための例外です。LibraryAdmin.java:admin インターフェースと AdminService の実装です。Library.java:本の追加・削除、ユーザー登録、貸し出し・返却、検索、例外処理など、すべてのメソッドを備えた完全な Library クラスです。Main.java:システム全体が連携して動作することを示す統合テストです。
Main クラスでは、ライブラリシステムの主要な機能をすべてテストする一連のコマンドを処理します。コマンドは、次の形式のカンマ区切りの1つの文字列として渡されます。
ADD_BOOK:isbn:title:author- AdminService を介して本を追加REGISTER_USER:id:name- AdminService を介してユーザーを登録BORROW:userId:isbn- 本を借りる(例外処理付き)RETURN:userId:isbn- 本を返却SEARCH_TITLE:keyword- タイトルで本を検索SEARCH_AUTHOR:keyword- author で本を検索REMOVE_BOOK:isbn- AdminService を介して本を削除
各コマンドを処理し、適切な出力を表示します。
- ADD_BOOK:
Added: [title] - REGISTER_USER:
Registered: [name] - BORROW:成功メッセージ、または
Error: [exception message]を表示 - RETURN:
[userName] returned [bookTitle] - SEARCH_TITLE:
Search '[keyword]':を表示した後、一致する各本の詳細を表示します。一致する本がない場合はNo resultsを表示します。 - SEARCH_AUTHOR:タイトル検索と同じ形式
- REMOVE_BOOK:
Removed: [isbn]またはCannot remove: [isbn]
すべてのコマンドの後に、最終的な概要を表示します。
--- Final Status ---Books: [count]Users: [count]- 各ユーザーについて、
[name]: [borrowedCount] book(s)を表示
入力は1つで、カンマ区切りのコマンド文字列です。
たとえば、入力が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の場合、出力は次のようになります。
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)この最後のチャレンジでは、すべてのコンポーネント、クラス、インターフェース、例外、およびライブラリのロジックがシームレスに連携して動作することを検証します。完全で堅牢な Library Management System を構築しました!
自分で試してみよう
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// カンマ区切りのコマンドを読み取る
String input = scanner.nextLine();
String[] commands = input.split(",");
// LibraryとAdminServiceを作成する
Library library = new Library();
AdminService adminService = new AdminService(library);
// 各コマンドを処理する
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: RETURNコマンドの処理を追加する
// TODO: SEARCH_TITLEコマンドの処理を追加する
// TODO: SEARCH_AUTHORコマンドの処理を追加する
}
// TODO: 最終ステータスを出力する
// --- Final Status ---
// 書籍: [count]
// ユーザー: [count]
// 各ユーザーについて: [name]: [borrowedCount] 冊
System.out.println("Operations completed");
}
}
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造自分で練習してみよう: Javaオンラインコンパイラ