Контрольна робота з дисципліни Advanced Java
Варіант: V22 (P4 + R4)
Тривалість: 80 хвилин. Формат: індивідуально, автономно в аудиторії.
Ваше завдання: реалізувати міні-сервіс Order Processing з шаблонним процесом обробки замовлення.
Обов'язкові технічні вимоги:
Java 17, Maven, JUnit. Сторонні бібліотеки дозволені. Логування - будь-який підхід/бібліотека. Базові вимоги до реалізації:
Доменні сутності/VO (наприклад: Order, OrderItem, Money, Email). Інкапсуляція: без public-полів. Для мінімум одного класу реалізувати toString(), equals(), hashCode(). Використати PaymentMethod як інтерфейс і щонайменше 2 реалізації. Використати композицію для залежностей сервісу (не створювати ключові залежності через new всередині бізнес-методів). Додати API-метод з Optional (наприклад, Optional findById(...)). Продемонструвати ланцюжок конструкторів через this(...) та super(...). Показати роботу з масивом (наприклад, OrderItem[]) і defensive copy. Обов'язкова архітектурна конструкція:
Інтерфейси + щонайменше один абстрактний клас + Template Method. Рекомендована форма: abstract class OrderProcessorTemplate з final process(...). Кроки процесу: валідація, розрахунок, оплата, завершення/повідомлення. Частина кроків має бути абстрактною, частина - з базовою реалізацією. Вимоги до помилок і логування:
Базовий доменний виняток (наприклад, AppException) + кілька спеціалізованих. Показати checked або інфраструктурний виняток із cause. Використати exception chaining (new ...(..., cause)). Логи: INFO для основних кроків, WARN для очікуваних бізнес-помилок, ERROR для неочікуваних/інфраструктурних збоїв. Вимоги до тестів:
Мінімум 10 тестів на JUnit. Мінімум 1 параметризований тест (@ParameterizedTest). Мінімум 5 негативних тестів (невалідні дані/винятки/неуспішні сценарії). Git і здача:
Окремий репозиторій для контрольної. Фінальний стан у гілці main. Мінімум 1 додаткова гілка та мінімум 1 прийнятий Merge Request у main. Зробити push у віддалений репозиторій. У відповіді до цього питання вказати лише посилання на репозиторій. Індивідуальні умови вашого варіанта:
Профіль оплати P4: CardPayment: дозволяє суму до 35_000; PayPalPayment: приймає суму від 400; BankTransferPayment: комісія 2.5%. Пакет правил R4: валідація - загальна кількість одиниць товару <= 30. Знижки/комісії: знижка 12% при кількості одиниць >= 10. Переходи станів: після PAID скасування заборонено. Додатковий крок Template Method: реалізувати крок validateDeliveryAddress. Обов'язковий негативний сценарій: передбачити і протестувати виняток InvalidAddressException.