DepositAccount не получается задать конфигурацию подсчёта месяцев
Помогите исправить фрагмент кода! Автотесты закидывает 1 месяц 1 день(код должен показать что прошол только месяц), а показывает что прошло 2!?
public class DepositAccount extends BankAccount {
LocalDate lastIncome = null;
@Override
public void put(double amountToPut) {
if (amountToPut >= 0) {
lastIncome = LocalDate.now();
balance += amountToPut;
System.out.println(balance);
} else {
System.out.println("Введённая сумма меньше нуля");
}
}
@Override
public void take(double amountToTake) {
if (amountToTake < 0) {
System.out.println("Введённая сумма меньше нуля");
} else if (amountToTake <= balance) {
if (lastIncome == null) {
System.out.println("Не было пополнений");
} else if (ChronoUnit.DAYS.between(lastIncome, LocalDate.now()) >= 30) {
balance -= amountToTake;
System.out.println(balance);
} else {
System.out.println("С последнего пополнения прошло менее 30 дней");
}
} else {
System.out.println("На счету недостаточно денег");
}
}
}
Ответы (1 шт):
Данный код невозможно исправить, потому что неизвестно, что именно делают "магические" автотесты. Я могу лишь констатировать проблему конкретно этого кода. Обратите внимание на эту строку:
ChronoUnit.DAYS.between(lastIncome, LocalDate.now())
Логических ошибок здесь нет, но полученный результат в днях сравнивается с 30. Это означает, что от даты, записанной в переменную lastIncome, должно пройти 30 дней и более по сравнению с датой текущей. И это будет работать, но есть одно "но".
Календарный месяц - это не 30 дней. Есть месяцы, в которых 31 день, а в феврале вообще 28. И именно в этом основная проблема. Любой здравый программист для получения даты, которая меньше текущей на 1 месяц и 1 день напишет такой код:
LocalDate.now().minusDays(1).minusMonths(1)
и никогда не напишет такой (именно по указанной выше причине):
LocalDate.now().minusDays(31)
Я думаю, что именно так поступил человек,писавший автотесты. В таком случае вы получите очевидную проблему, ведь в переменной lastIncome окажется значение 29 (в феврале 28 дней + 1 день), а не 31. При сравнении с 30 условие не сработает и тест провалится.
Вы можете легко проверить это, если выведете переменную lastIncome в консоль и посчитатьсколько дней прошло от этой даты до текущей. Я почти уверен, что получится 29, а не 31.