テストと統合
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 83/87。
チャレンジ
簡単図書館管理システムの構築、おめでとうございます!いよいよすべてをまとめ、すべてのコンポーネントが統合されたシステムとして正しく機能することを確認する時が来ました。このプロジェクトを通じて構築してきたすべての機能を実行する、包括的なテストシナリオを作成します。
完成したシステムの全7つのファイルを扱います:
Book.java: isbn、title、author、isAvailable、borrowedBy、およびgetDetails()を含むすべての関連メソッドを持つ Book クラス。User.java: id、name、borrowedBooks リスト、および本の貸出/返却メソッドを持つ User クラス。LibraryException.java: 基本となるカスタム例外クラス。BookNotAvailableException.java: 利用不可能な本のための例外クラス。LibraryAdmin.java: 管理者インターフェースと AdminService の実装。Library.java: 本の追加/削除、ユーザー登録、貸出/返却、検索、および例外処理を含む、完全な Library クラス。Main.java: システム全体が連携して動作することを示す統合テスト。
Main クラスでは、図書館システムのすべての主要機能をテストする一連のコマンドを処理します。コマンドは、以下の形式のカンマ区切り文字列として提供されます:
ADD_BOOK:isbn:title:author- AdminService を介して本を追加するREGISTER_USER:id:name- AdminService を介してユーザーを登録するBORROW:userId:isbn- 本を借りる(例外処理を含む)RETURN:userId:isbn- 本を返却するSEARCH_TITLE:keyword- タイトルで本を検索するSEARCH_AUTHOR:keyword- 著者で本を検索する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)この最後の課題は、クラス、インターフェース、例外、およびライブラリロジックといったすべてのコンポーネントがシームレスに連携することを検証するものです。あなたは、完全で堅牢な図書館管理システムを構築しました!
自分で試してみよう
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: 最終ステータスを出力する
// --- 最終ステータス ---
// Books: [count]
// Users: [count]
// 各ユーザーについて: [name]: [borrowedCount] 冊の本
System.out.println("Operations completed");
}
}
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造