Ответ 1
То, что вы видите, - это скрытый байт-код, создаваемый из-за перечисления.
Чтобы избавиться от этой проблемы, добавьте вызов методам values () и valueOf() в перечислении, как упоминалось ранее Карлом Манастером и Питером Лори.
Я запускаю EclEmma, плагин Emma для Eclipse, и отчет о покрытии показывает только частичное покрытие для Enum, которое я определил, хотя он показывает единственное значение в Enum как охватываемое. Я предполагаю, что существует пробел в покрытии для подразумеваемых методов, возвращающих Enum, но я не совсем уверен.
Например, с этим Enum EclEmma выделяет все зеленым цветом, за исключением объявления пакета:
package com.blah;
public enum UserRole {
HAS_ACCESS
}
Если я вытягиваю детали покрытия для класса, я вижу следующее:
Мой вопрос: какой лучший способ получить 100% -ый охват моих классов Enum с помощью EclEmma?
То, что вы видите, - это скрытый байт-код, создаваемый из-за перечисления.
Чтобы избавиться от этой проблемы, добавьте вызов методам values () и valueOf() в перечислении, как упоминалось ранее Карлом Манастером и Питером Лори.
Я согласен с другими плакатами, что 100% -ный охват кода может быть ошибочным. Но я должен признать, что получил 100% -ный охват ново написанного основного кода.
К счастью, поскольку все перечисления расширяют один и тот же "класс", вы можете достичь 100% с небольшой помощью от отражения вашего друга.
Просто добавьте следующий статический метод в класс для вызова ваших тестеров, используя параметр [EnumTypeName].class в качестве параметра.
public static void superficialEnumCodeCoverage(Class<? extends Enum<?>> enumClass) {
try {
for (Object o : (Object[])enumClass.getMethod("values").invoke(null)) {
enumClass.getMethod("valueOf", String.class).invoke(null, o.toString());
}
}
catch (Throwable e) {
throw new RuntimeException(e);
}
}
Предполагая, что эта статическая функция была реализована в классе под названием "Shared", вам нужно будет включить эту строку для каждого перечисления:
Shared.superficialEnumCodeCoverage(UserRole.class);
Ключевое слово "поверхностное".
Мы столкнулись с аналогичной проблемой, когда компилятор генерировал методы для перечислений, такие как values (), как правило, не вызывались в нашем тестовом коде. Мы работали над проблемой, отфильтровывая номера наших объектов перечисления из нашего окончательного отчета.
Вот почему я не люблю использовать покрытие кода как меру полноты. Когда я подумаю о лучшей метрике, я дам вам знать.:)