100 % покрытие теста junit

По домашней работе мне требуется добиться 100% покрытия тестами кода:


package ru.netology.statistic; public class StatisticsService {
    /**
     * Calculate index of max income
     *
     * @param incomes - array of incomes
     * @return - index of first max value
     */
    public long findMax(long[] incomes) {
        long current_max_index = 0;
        long current_max = incomes[0];
        for (long income : incomes)
            if (current_max < income)
                current_max = income;
        return current_max;
    } 
}

при прогоне через jacoco выдает 85 процентов покрытия и показывает , что строчка long current_max_index = 0; не используется в тестах. Как добиться 100% покрытия? Сам тест

void findMax() {
        StatisticsService service = new StatisticsService();
        long[] incomesInBillions = {12, 5, 8, 4, 5, 3, 8, 6, 11, 11, 12};
        long expected = 12;
        long actual = service.findMax(incomesInBillions);
        assertEquals(expected, actual);
    }

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Давайте поанализируем код вместе. Строки 1, 2, 3 исполняются при любом вызове метода findMax. Строка 4 вызовется только если массив incomes не пуст. В тесте ниже так и есть. Строка 5 вызывается когда... Никогда она не вызывается. В тесте максимальное значение идёт первым элементом. В строке 2 оно попадает в переменную current_max. Поэтому условие current_max < income всегда ложно. Строка 6 вызывается всегда.

Единственная строка которая не покрыта текущим тестом - 5. Чтобы исправить уменьшите первый элемент массива.

public long findMax(long[] incomes) {
/* 1 */    long current_max_index = 0;
/* 2 */    long current_max = incomes[0];
/* 3 */    for (long income : incomes)
/* 4 */        if (current_max < income)
/* 5 */            current_max = income;
/* 6 */    return current_max;
} 

...

long[] incomesInBillions = {12, 5, 8, 4, 5, 3, 8, 6, 11, 11, 12};
long actual = service.findMax(incomesInBillions);
→ Ссылка