Menu
Coddy logo textTech

Тестирование и интеграция

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 83 из 87.

challenge icon

Задание

Легко

Поздравляем с созданием вашей системы управления библиотекой! Пришло время собрать все воедино и убедиться, что все компоненты правильно работают как интегрированная система. Вы создадите комплексный тестовый сценарий, который задействует все функции, созданные вами в ходе этого проекта.

Вы будете работать со всеми семью файлами из вашей завершенной системы:

  • 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 ---
        // Books: [count]
        // Users: [count]
        // Для каждого пользователя: [name]: [borrowedCount] book(s)
        System.out.println("Operations completed");
    }
}

Все уроки раздела Объектно-ориентированное программирование