Menu
CoddyTech

测试与集成

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 83 课,共 87 课。

challenge icon

挑战

简单

恭喜你完成了图书管理系统!现在,该把所有内容整合起来,并验证所有组件能否作为一个集成系统正常工作了。你将创建一个全面的测试场景,测试你在整个项目中实现的所有功能。

你将使用已完成系统中的全部 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 在线编译器