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 шт):
Давайте поанализируем код вместе. Строки 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);