Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

Домашнее задание к занятию «Композиция и зависимость объектов. Mockito при создании автотестов»

В качестве результата пришлите ссылки на ваши GitHub-проекты в личном кабинете студента на сайте netology.ru.

Все задачи этого занятия можно делать в одном репозитории.

Важно: если у вас что-то не получилось, то оформляйте Issue по установленным правилам.

Как сдавать задачи

  1. Инициализируйте на своём компьютере пустой Git-репозиторий
  2. Добавьте в него готовый файл .gitignore
  3. Добавьте в этот же каталог необходимые файлы
  4. Сделайте необходимые коммиты
  5. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым
  6. Сделайте пуш (удостоверьтесь, что ваш код появился на GitHub)
  7. Ссылку на ваш проект отправьте в личном кабинете на сайте netology.ru
  8. Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачета

Задача №1 - "Менеджер Афиши"

Легенда

На основе проекта с лекции необходимо реализовать менеджер Афиши (все фильмы хранятся внутри самого менеджера, без всякого репозитория):

Какие методы должны быть у менеджера?

  1. Добавить фильм в ленту.
  2. Выдать последние 10 добавленных фильмов* (фильмы выдаются в обратном порядке, т.е. первым в массиве результатов будет тот, который был добавлен последним).

Примечание*: если фильмов меньше 10, то выдаёте столько, сколько есть.

Сделайте так, чтобы по умолчанию выводилось последние 10 добавленных фильмов, но при создании менеджера можно было указать другое число, чтобы, например, выдавать 5 (а не 10).

Напишите необходимые, с вашей точки зрения, автотесты на различные состояния менеджера (можно их делать не в одном файле).

Требования к проекту:

  1. Подключите плагин Surefire так, чтобы сборка падала в случае отсутствия тестов.
  2. Подключите плагин JaCoCo в режиме генерации отчётов (обрушать сборку по покрытию не нужно).
  3. Реализуйте нужные классы и методы.
  4. Напишите автотесты на методы, содержащие логику, добившись 100% покрытия по branch'ам.
  5. Подключите CI на базе Github Actions и выложите всё на Github.

Как делать:

  1. Берёте код с лекции
  2. Заливаете в свой репозиторий
  3. Делаете новую ветку
  4. В новой ветке делаете все изменения (Surefire, JaCoCo, методы, автотесты, CI)
  5. Делаете Pull Request из этой ветки к своему же репозиторию

Итого: у вас должен быть репозиторий на GitHub, в котором расположен ваш Java-код и Pull Request.

Задача №2 - "Менеджер Афиши" (divide and conquer)*

Важно: это необязательная задача. Её (не)выполнение не влияет на получение зачёта по ДЗ.

Легенда

В первой задаче создайте новую ветку layers, в которой разделите менеджера на менеджера и репозиторий.

В репозитории должны быть следующие методы:

  1. findAll - возвращает массив всех хранящихся в массиве объектов
  2. save - добавляет объект в массив
  3. findById - возвращает объект по идентификатору (либо null, если такого объекта нет)
  4. removeById - удаляет объект по идентификатору (если объекта нет, то пусть будет исключение, как на лекции)
  5. removeAll* - полностью вычищает репозиторий
Подсказка

Для удаления всех элементов достаточно в items положить пустой массив.

В Java встроен механизм, который называется Garbage Collection (сборка мусора), он сам удаляет из памяти машины неиспользуемые объекты.

Как должен работать менеджер

Если брать пример из лекции и реализовывать репозиторий, работающий в памяти, то репозиторий будет выглядеть вот так:

package ru.netology.repository;

import ru.netology.domain.PurchaseItem;

public class CartRepository {
  private PurchaseItem[] items = new PurchaseItem[0];

  public void save(PurchaseItem item) {
    int length = items.length + 1;
    PurchaseItem[] tmp = new PurchaseItem[length];
    System.arraycopy(items, 0, tmp, 0, items.length);
    int lastIndex = tmp.length - 1;
    tmp[lastIndex] = item;
    items = tmp;
  }

  public PurchaseItem[] findAll() {
    return items;
  }

  public void removeById(int id) {
    int length = items.length - 1;
    PurchaseItem[] tmp = new PurchaseItem[length];
    int index = 0;
    for (PurchaseItem item : items) {
      if (item.getId() != id) {
        tmp[index] = item;
        index++;
      }
    }
    items = tmp;
  }
}

А сервис вот так:

package ru.netology.manager;

import ru.netology.domain.PurchaseItem;
import ru.netology.repository.CartRepository;

public class CartManager {
  private CartRepository repository;

  public CartManager(CartRepository repository) {
    this.repository = repository;
  }

  public void add(PurchaseItem item) {
    repository.save(item);
  }

  public PurchaseItem[] getAll() {
    PurchaseItem[] items = repository.findAll();
    PurchaseItem[] result = new PurchaseItem[items.length];
    for (int i = 0; i < result.length; i++) {
      int index = items.length - i - 1;
      result[i] = items[index];
    }
    return result;
  }

  public void removeById(int id) {
    repository.removeById(id);
  }
}

Напишите автотесты на репозиторий (допускается, что как и в лекции на removeById может возникать исключение при удалении по несуществующему id).

Обеспечьте использование менеджером созданного вами репозитория (новых функций в менеджер по сравнению с первым заданием добавлять не нужно). Репозиторий должен быть зависимостью для менеджера (т.е. задаваться через конструктор и храниться в приватном поле).

Покройте менеджера автотестами, используя Mockito для организации моков репозитория.

Итого у вас должно быть:

  1. Ветка layers, в которой должны быть классы AfishaManager и AfishaRepository
  2. Pull Request на Github (удостоверьтесь, что CI успешно проводит сборку*)

Примечание*: если вы реализовали тест на удаление по несуществующему id, то допускается, что сборка в CI будет failed.

Итого: у вас должен быть репозиторий на GitHub, в котором расположен ваш Java-код и Pull Request.