Может ли полностью покрытый код иметь рейтинг покрытия EclEmma менее 100 %?

Я только что написал простой пример кода, чтобы убедиться, что EclEmma установлена ​​правильно. Я не получаю 100% покрытия, и я не понимаю, почему. Подсветка подразумевает, что это связано с именем класса. Вот мой код с соответствующими тестами JUnit, как его выделила ЭклЭмма:

Арифметический класс

Тесты для арифметического класса

Результаты покрытия показывают, что три инструкции в Arithmetic не выполняются, хотя оба фактических метода кажутся полностью покрытыми:

Информация о покрытии

Я прочитал документацию EclEmma о базовом покрытии блоков, но я все еще смущен. Я не уверен, какие основные блоки пропущены. Сначала я подумал, что EclEmma может просто игнорировать байт-код для классов, но ArithmeticTest, похоже, обрабатывается просто отлично.

У меня есть два тесно связанных вопроса:

  1. Указывает ли это на проблему с тем, как я установил/настроил EclEmma?
  2. Является ли нормальным/приемлемым, чтобы полностью покрываемый код имел высокий, но не совсем 100% рейтинг покрытия EMMA, и если да, то как это работает?

person Pops    schedule 08.06.2012    source источник


Ответы (3)


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

Так как он не помечен должным образом в текстовом блоке, Эмма не может связать регистрацию покрытия с текстовым файлом, и похоже, что какой-то код не покрыт; потому что вы запустили какой-то байт-код, но запись строки не может быть зарегистрирована. Позже, когда отчетный элемент читает журнал строк, он не может найти номера строк для конструктора по умолчанию, и он выделяет ошибку в единственном месте, где это имеет смысл, — в строке объявления класса.

Конструктор по умолчанию выглядит так

public Arithmetic() {
  super();
}

Где super является подразумеваемой первой инструкцией, которая создаст Object. Хотя вы можете опустить его присутствие, компилятор добавит его за вас. Вот где вы получаете «3 строки» вместо одной.

person Edwin Buck    schedule 08.06.2012
comment
На самом деле, у него есть блок текста, он просто пустой. В байт-коде конструктор по умолчанию находится в строке, отмеченной красным цветом EclEmma. Чтобы покрыть его и сделать зеленым, тесту достаточно вызвать конструктор: new Arithmetic(). Конечно, правильнее было бы объявить в классе конструктор по умолчанию private. - person Rogério; 09.05.2015

Я думаю, вам нужно будет либо проверить создание экземпляра Arithmetic, либо объявить его конструктор private, чтобы запретить создание экземпляра.

person Attila    schedule 08.06.2012
comment
Ах, тестирование конструктора делает это. EclEmma не более счастлив с частным конструктором, но я думаю, что где-то видел обходной путь для этого. - person Pops; 08.06.2012

IIRC, вам нужно создать экземпляр класса, чтобы использовать конструктор, предоставленный языком.

person D.Shawley    schedule 08.06.2012