测试与集成
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 83 课,共 87 课。
挑战
简单恭喜你完成了图书管理系统!现在,该把所有内容整合起来,并验证所有组件能否作为一个集成系统正常工作了。你将创建一个全面的测试场景,测试你在整个项目中实现的所有功能。
你将使用已完成系统中的全部 7 个文件:
Book.java:你的 Book 类,包含 isbn、title、author、isAvailable、borrowedBy,以及所有相关方法,包括getDetails()。User.java:你的 User 类,包含 id、name、borrowedBooks 列表,以及借阅和归还图书的方法。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)
你将收到一个输入:逗号分隔的命令字符串。
例如,输入 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: 输出最终状态
// --- Final Status ---
// 图书:[count]
// 用户:[count]
// 每位用户:[name]:借阅了 [borrowedCount] 本书
System.out.println("Operations completed");
}
}
面向对象编程中的所有课
自己练习: Java 在线编译器