Тестирование и интеграция
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 83 из 87.
Задание
ЛегкоПоздравляем с созданием вашей системы управления библиотекой! Пришло время собрать все воедино и убедиться, что все компоненты правильно работают как интегрированная система. Вы создадите комплексный тестовый сценарий, который задействует все функции, созданные вами в ходе этого проекта.
Вы будете работать со всеми семью файлами из вашей завершенной системы:
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— Добавить книгу через AdminServiceREGISTER_USER:id:name— Зарегистрировать пользователя через AdminServiceBORROW: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");
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка10Обработка исключений в ООП
Иерархия классов исключенийПользовательские исключенияПроверяемые и непроверяемые ошибкиПаттерн Try With ResourcesПовторение — Validated User13Проект: Управление библиотекой
Обзор проекта и UML-проектированиеКлассы Book и User2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»