Cobertura отказывается признать, что код был покрыт - PullRequest
2 голосов
/ 13 октября 2008

Я использую плагин Maven (2) Cobertura для создания отчетов о покрытии кода, и у меня есть следующая заглушка, которую я использую в методе:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
}
System.err.println("The program never exited!");

Я знаю, что мне нужно зарегистрировать исключение и т. Д., Но сейчас дело не в этом ... Cobertura отказывается признать, что строка после печати трассировки стека покрыта. То есть строка с символом '}' перед оператором System.err.println не отображается как покрытая. Ранее заключительная фигурная скобка метода не отображалась как покрытая, следовательно, оператор System.err. Любая идея, как я могу убедить плагин cobertura maven в том, что, поскольку оператор System.err.println покрыт, эта конечная скобка должна быть закрыта?

О да, и я использую фиктивный менеджер безопасности, чтобы вызвать исключение безопасности, поскольку я нашел самый простой способ заставить тест продолжаться после вызова System.exit.

Ответы [ 4 ]

8 голосов
/ 13 октября 2008

Я бы посмотрел отчет о покрытии. Дважды проверьте мои тесты. Обратите внимание, что код действительно покрывается, и не беспокойтесь о достижении 100%. Покрытие кода лучше всего использовать для поиска областей, в которых вы, возможно, пренебрегали своими тестами, но просто сосредоточиться на получении 100% покрытия, так как цель - плохая привычка, которая может привести к тому, что вы пропустите тесты, которые нужно писать только потому, что ваш инструмент показывает 100%. Используйте инструмент для того, что он может сделать, но не попадайтесь в ловушку, позволяющую инструменту определять, что вы делаете.

4 голосов
/ 13 октября 2008

В формате файла классов Java каждый метод помечен смещением кода таблицы для номеров строк. В этом случае закрывающая фигурная скобка не производит никакого байт-кода, следовательно, она не покрыта. Это проблема несовершенного соответствия между источником и байт-кодом. Он должен обрабатываться инструментом покрытия, распознавая эту строку как некодовую.

Я знаю, что Эмма имеет похожие проблемы. Клевер стоит намного лучше, но коммерческий (не уверен, что он справится и с этим делом). Если вы используете IDEA, вы должны попробовать их новую реализацию покрытия - это довольно хорошо и находится в активной разработке.

1 голос
/ 13 октября 2008

Я не пользовался Cobertura некоторое время (2005?), И видел такое поведение тогда. Аналогичная проблема существует с NCover для C # и фигурными скобками после блоков catch / finally.

Мое предложение было бы добавить к этот отчет об ошибке в Cobertura с подробным описанием аналогичной проблемы . Кроме того, следуйте советам @ tvanfosson и поймите, что отсутствие фигурной скобки, которая на самом деле не становится ничем в JVM, это то, что вы можете игнорировать как «шум».

0 голосов
/ 28 мая 2013

Я знаю, что это старый вопрос, и что Cobertura уже исправил это, но для полноты отсутствующее покрытие в "}" было вызвано внутренним автоматическим блоком "finally".

См. Ваш код следующим образом:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
} finally {
    // noop
}

К счастью, в некоторых версиях этого больше не происходит.

...