Jacoco 0.8.0 помечает бросок и обрыв во всех случаях переключения, несмотря на тесты - PullRequest
0 голосов
/ 19 сентября 2019

Я нахожусь на "Jacoco 0.8.0".У меня есть заявление о переключении с тестами для всех случаев.Jacoco помечает бросок и разрыв в каждом случае в операторе switch.Случай по умолчанию и разрыв не помечены.Зачем это помечать?

Я осмотрелся и нашел посты, подобные этим, в которых говорилось, что в предыдущих версиях не было фильтра для операторов переключения: Почему JaCoCo не покрывает мои операторы переключения строк?

Но я использую 0.8.0, которая после этого исправления, и проблема немного отличается.

MRE:

public class MyClass{

    public void myMethod(String let) {
           switch (let) {
               case "A":
                   throw new Exception();
                   break;

               default:
                   break;
           }
      }

}

Тесты для каждого:

@Test(expected = Exception.class)
    public void testMyMethodA() {
        MyClass class = new MyClass();
       class.myMethod("A");
    }

@Test(expected = Exception.class)
    public void testMyMethodDefault() {
        MyClass class = new MyClass();
       class.myMethod("Z");
    }

Пример флагов:

public class MyClass{

    public void myMethod(String let) {
[YELLOW]  switch (let) {
               case "A":
[RED]          throw new Exception();
[RED]          break;

               default:
                   break;
           }
      }

}

Jacoco помечает операторы throw и разрывы как непроверенные.Он помечает переключатель как частично протестированный.Я ожидал, что они будут покрыты.

1 Ответ

2 голосов
/ 19 сентября 2019

Прежде всего ваш MRE

public class MyClass{

    public void myMethod(String let) {
           switch (let) {
               case "A":
                   throw new Exception();
                   break;

               default:
                   break;
           }
      }

}

не может быть скомпилирован

javac --version
javac 11.0.3

из-за следующих ошибок

javac MyClass.java
MyClass.java:7: error: unreachable statement
                   break;
                   ^
MyClass.java:6: error: unreported exception Exception; must be caught or declared to be thrown
                   throw new Exception();
                   ^
2 errors

Если вы 'Посмотрите на домашнюю страницу JaCoCo , вы можете заметить, что 0.8.0 уже почти два года, а последняя версия 0.8.4

И журнал изменений JaCoCo в егообычное местоположение на странице https://www.jacoco.org/jacoco/trunk/doc/changes.html содержит

Релиз 0.8.2 (2018/08/21)

  • Часть байт-кода, которую javac генерирует для switchоператор для значений java.lang.String с небольшим числом случаев теперь корректно отфильтровывается при создании отчета (GitHub # 730 ).

, так что для исправленного примера

class Example {
    public void myMethod(String let) {
        switch (let) {
        case "A":
            throw new RuntimeException();
        default:
            break;
        }
    }

    public static void main(String[] args) {
        for (String s : new String[]{"A", "B"}) {
            try {
                new Example().myMethod(s);
            } catch (Exception ignore) {
            }
        }
    }
}

JaCoCo 0.8.4 создает следующий ожидаемый отчет

javac Example.java -d classes

java -javaagent:jacoco-0.8.4/lib/jacocoagent.jar -cp classes Example

java -jar jacoco-0.8.4/lib/jacococli.jar report \
    jacoco.exec \
    --classfiles classes \
    --sourcefiles . \
    --html report

report


Asэмпирическое правило и цитирование объявлений о выпуске JaCoCo

как всегда, мы рекомендуем использовать последнюю выпущенную версию

...