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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Java