Ця програма – імітація іподрому

Для початку, як і в попередньому проєкті, зроби собі форк із репозиторію: https://github.com/pavlo-plynko/hippodrome і склонуй цей форк.

Твоє завдання – додати тестування та логування.

Список необхідних тестів

Кожен пункт із подальшого списку потрібно реалізувати як тестовий метод. Під час називання тестових методів намагайся бути лаконічним, але водночас подумай, як зробити так, щоб можна було приблизно зрозуміти, що саме в них тестується. Наприклад, порівняй ці два результати тестування:

У другому випадку важче зрозуміти, які тести не пройшли, і тобі доведеться дивитися логи.

1. Клас Horse:

  1. конструктор
    • Перевірити, що при передачі до конструктора першим параметром null буде викинуто IllegalArgumentException. Для цього потрібно скористатися методом assertThrows;
    • Перевірити, що при передачі до конструктора першим параметром null виняток міститиме повідомлення "Name cannot be null.". Для цього потрібно отримати повідомлення з перехопленого винятку та скористатися методом assertEquals;
    • Перевірити, що при передачі до конструктора першим параметром порожнього рядка або рядка, що містить лише пробільні символи (пробіл, табуляція, тощо), буде викинуто IllegalArgumentException. Для виконання перевірки з різними варіантами пробільних символів потрібно зробити тест параметризованим;
    • Перевірити, що при передачі до конструктора першим параметром порожнього рядка або рядка, що містить лише пробільні символи (пробіл, табуляція, тощо), виняток міститиме повідомлення "Name cannot be blank.";
    • Перевірити, що при передачі до конструктора другим параметром від'ємного числа, буде викинуто IllegalArgumentException;
    • Перевірити, що при передачі до конструктора другим параметром від'ємного числа, виняток міститиме повідомлення "Speed cannot be negative.";
    • Перевірити, що при передачі до конструктора третім параметром від'ємного числа, буде викинуто IllegalArgumentException;
    • Перевірити, що при передачі до конструктора третім параметром від'ємного числа, виняток міститиме повідомлення "Distance cannot be negative.";
  2. метод getName
    • Перевірити, що метод повертає рядок, який передавався першим параметром до конструктора;
  3. метод getSpeed
    • Перевірити, що метод повертає число, яке передалося другим параметром до конструктора;
  4. метод getDistance
    • Перевірити, що метод повертає число, яке передалося третім параметром конструктора;
    • Перевірити, чи метод повертає нуль, якщо об'єкт створено за допомогою конструктора з двома параметрами;
  5. метод move
    • Перевірити, що метод викликає всередині метод getRandomDouble параметрів 0.2 і 0.9. Для цього потрібно використовувати MockedStatic і його метод verify;
    • Перевірити, що метод присвоює дистанції значення, яке обчислюється за такою формулою: distance + speed * getRandomDouble(0.2, 0.9). Для цього потрібно замокати getRandomDouble, щоб він повертав певні значення, які треба встановити за допомогою параметризації тесту.

2. Клас Hippodrome:

  1. Конструктор
    • Перевірити, що при передачі до конструктора null буде викинуто IllegalArgumentException;
    • Перевірити, що при передачі до конструктора null виняток міститиме повідомлення "Horses cannot be null.";
    • Перевірити, що при передачі до конструктора порожнього списку буде викинуто IllegalArgumentException;
    • Перевірити, що при передачі до конструктора порожнього списку виняток міститиме повідомлення "Horses cannot be empty.";
  2. метод getHorses
    • Перевірити, що метод повертає список, який містить ті ж об'єкти і в такій самій послідовності, що й список, який передався до конструктора. При створенні об'єкта Hippodrome передай до конструктора список із 30 різних коней;
  3. метод move
    • Перевірити, що метод викликає метод move у всіх коней. При створенні об'єкта Hippodrome передай до конструктора список із 50 моків коней та скористайся методом verify.
  4. метод getWinner
    • Перевірити, що метод повертає коня з найбільшим значенням distance.

3. Клас Main

  1. метод main
    • Перевірити, що метод виконується не довше 22 секунд. Для цього скористайся анотацією Timeout. Після написання цього тесту, вимкни його (скористайся анотацією Disabled). Таким чином він не займатиме час під час запуску всіх тестів, а за необхідності його можна буде запустити вручну.

Що потрібно логувати

1. Клас Main:

  1. Після створення об'єкта іподрому, додати в лог запис типу: 2022-05-31 17:05:26,152 INFO Main: Початок стрибків. Кількість учасників: 7
  2. Після виведення інформації про переможця, додати в лог запис типу: 2022-05-31 17:05:46,963 INFO Main: Закінчення стрибків. Переможець: Вишня

Клас Hippodrome:

  1. Якщо до конструктора передався null, то перед прокиданням виключення треба додати в лог запис типу:2022-05-31 17:29:30,029 ERROR Hippodrome: Horses list is null
  2. Якщо до конструктора передався порожній список, то перед прокиданням виключення треба додати в лог запис типу:2022-05-31 17:30:41,074 ERROR Hippodrome: Horses list is empty
  3. Наприкінці конструктора додати в лог запис типу:2022-05-31 17:05:26,152 DEBUG Hippodrome: створення Hippodrome, коней [7]

3. Клас Horse:

  1. Якщо конструктор замість імені передав null, перед прокиданням винятку треба додати в лог запис типу: 2022-05-31 17:34:59,483 ERROR Horse: Name is null
  2. Якщо ім'я, що передалося до конструктора порожнє, перед прокиданням винятку треба додати в лог запис типу: 2022-05-31 17:36:44,196 ERROR Horse: Name is blank
  3. Якщо швидкість, що передалася до конструктора менша за нуль, перед прокиданням винятку треба додати в лог запис типу: 2022-05-31 17:40:27,267 ERROR Horse: Speed is negative
  4. Якщо дистанція, що передалася до конструктора менша за нуль, перед прокиданням винятку треба додати в лог запис типу: 2022-05-31 17:41:21,938 ERROR Horse: Distance is negative
  5. Наприкінці конструктора додати в лог запис типу: 2022-05-31 17:15:25,842 DEBUG Horse: створення Horse, ім'я [Лобстер], швидкість [2.8]

Логи мають записуватися до файлу hippodrome.log, який розташовується в корені проєкту в папці logs. Кожен день файл має переназиватися за шаблоном у hippodrome.2021-12-31.log і замість нього повинен створюватися новий hippodrome.log. Для цього використовуй апендер RollingFile. Водночас файли старше 7 днів мають видалятися. Для цього можеш використовувати таку конструкцію:


<DefaultRolloverStrategy>
    <Delete …>
        <IfFileName …/>
        <IfLastModified …/>
    </Delete>
</DefaultRolloverStrategy>

Погугли, що треба вказати замість трьох крапок :)


Розбір проекту. Дивись після виконання!

Конфигурация GitHub Actions