Тестирование и интеграция
Часть раздела Объектно-ориентированное программирование путешествия по 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 ---
// Книги: [count]
// Пользователи: [count]
// Для каждого пользователя: [name]: [borrowedCount] книг(и)
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 и UserСистема выдачи книгФункционал поискаИнтерфейс администратораИнтеграция обработки исключенийТестирование и интеграция2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово 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
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java