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.

→ Ссылка