«Наследование и расширяемость систем. Проблемы наследования». «Исключительные ситуации и их обработка. Тестирование исключений».

Решения

Задание 1

Ветка main с проектом.

Задание 2

Ветка rich с проектом.

Задание 3, 4

  • NotFoundException.java - генерирующий исключение при попытке удаления несуществующего "продукта".
  • AlreadyExistsException.java - генерирующий исключение при попытке добавления "продукта" с повторяющимся id.
  • ProductRepositoryTest.java - автотесты.

Ветка expection с проектом.

Что было сделано

Задание 1

  • Создан Maven проект и настроен pom.xml с плагинами и зависимостями:
    • JunitJupier.
    • Surefire.
    • Lombok.
    • Jacoco в режиме генерации отчетов и обрушения сборки по покрытию 100% по бранчам методов.
    • Настроен maven.yml для Gitub CI.
  • Разрабон базовый класс Product.java - описывающий объект "продукт".
  • Разработано два унаследованных от Product.java класса: Book.java, Smartphone.java.
  • Реализован класс-репозиторий ProductRepository.java для сохранения, получения сохраненных, удаления экземпляра Product.
  • Реализован класс-менеджер ProductManager.java, для добавления экземпляра Product в репозиторий и осуществления поиска по ним.
  • Реализован класс с автотестами ProductRepositoryTest.java, проверяющий работу разработанных классов.

Задание 2

  • Создана ветка rich от ветки main в которой:

Задание 3, 4



Описание Задания 1. Менеджер товаров (обязательное к выполнению)

Вам необходимо реализовать менеджер товаров, который умеет:

  • добавлять товары в репозиторий,
  • искать товары.

Что нужно сделать:

  1. Разработайте базовый класс Product, содержащий ID, название, стоимость.
  2. Разработайте два унаследованных от Product класса: Book с текстовыми полями «название» и «автор» и Smartphone с текстовыми полями «название» и «производитель»; общие поля вынесите в родителя.
  3. Разработайте репозиторий, позволяющий сохранять Product, получать все сохранённые Product и удалять по ID. Для этого репозиторий будет хранить у себя поле с типом Product[] (массив товаров).
  4. Разработайте менеджера, который умеет добавлять Product в репозиторий и осуществлять поиск по ним. Для этого вам нужно создать класс, конструктор которого будет принимать параметром репозиторий, а также с методом publiс void add(Product product) и методом поиска (см. ниже).

Менеджер при переборе всех продуктов, хранящихся в репозитории, должен для каждого продукта вызывать определённый в классе менеджера же метод matches, который проверяет, соответствует ли продукт поисковому запросу.

При проверке на соответствие запросу товара мы проверяем вхождение запроса в текст названия товара.

Напишите тесты на менеджер и репозиторий, добившись 100% покрытия по бранчам методов с логикой.

Описание Задания 2*. Менеджер товаров: rich model (необязательная задача)

Достаточно часто объекты, моделирующие предметную область, называют моделями. Часто модели делают глупыми, то есть не содержащими никакой логики.

Но есть и другой подход, который позволяет делать умные или богатые модели (rich model), которые могут уже содержать определённую логику.

Что нужно сделать:

  1. Создайте в том же, что и первое задание, репозитории новую ветку rich на базе ветки первого задания.
  2. Реализуйте в классе Product метод public boolean matches(String search), который определяет, подходит ли продукт поисковому запросу исходя из названия.
  3. Переопределите этот метод в дочерних классах, чтобы они сначала вызывали родительский метод, и только если родительский метод вернул false, тогда проводили дополнительные проверки: Book — по автору, Smartphone — по производителю.
  4. Замените в менеджере вызов метода matches из класса самого менеджера на вызов метода matches у самих продуктов: if (product.matches(search)) {.
  5. Теперь вам нужны unit-тесты на методы ваших умных моделей, напишите их.
  6. Удостоверьтесь, что ранее написанные тесты на менеджера из решения задачи 1 проходят.
  7. Добейтесь 100% покрытия по бранчам методов с логикой.

Описание Задания 3. NotFoundException (обязательное к выполнению)

Вы развиваете приложение с менеджером товаров, который мы рассматривали на лекции, и решили сделать так, чтобы при попытке удаления несуществующего объекта из репозитория генерировалось ваше исключение, а не ArrayIndexOfBoundsException.

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

Что нужно сделать:

  1. Возьмите проект с менеджером, репозиторием и товарами, мы его писали в рамках ДЗ про наследование.
  2. Создайте класс исключения NotFoundException, отнаследовавшись от RuntimeException, и реализуйте как минимум конструктор с параметром-сообщением. Он будет просто вызывать суперконструктор предка, см. подсказку.
  3. В методе удаления removeById сначала проверяйте, есть ли элемент. Для этого прямо из метода removeById вызывайте метод findById: если результат null, тогда выкидывайте исключение NotFoundException.
  4. Напишите два автотеста на репозиторий: первый должен проверять успешность удаления существующего элемента, второй — генерации NotFoundException при попытке удаления несуществующего элемента.

Убедитесь, что ваши автотесты проходят. Напоминаем, что проект должен быть на базе Maven, с подключёнными зависимостями и необходимыми плагинами.

Мы рекомендуем вам указывать в сообщении исключения: при удалении по какому конкретно ID было сгенерировано ваше исключение. Простейший способ, как это можно сделать: "Element with id: " + id + " not found".

Описание Задания 4*. AlreadyExistsException (необязательная задача)

В том же самом проекте и в той же самой ветке добавьте следующую новую функциональность. В методе добавления нового товара в репозиторий должна осуществляться проверка на то, что в нём уже нет товара, у которого бы совпадал ID с ID добавляемого товара. Если же такой есть, то должно выкидываться ваше исключение — AlreadyExistsException.

Напишите два автотеста на репозиторий: первый должен проверять успешность добавления элемента, второй — генерации AlreadyExistsException при попытке добавить элемент с повторяющимся ID.