Подтвердить что ты не робот

Распространение Эммы на типах Enum

Я запускаю EclEmma, ​​плагин Emma для Eclipse, и отчет о покрытии показывает только частичное покрытие для Enum, которое я определил, хотя он показывает единственное значение в Enum как охватываемое. Я предполагаю, что существует пробел в покрытии для подразумеваемых методов, возвращающих Enum, но я не совсем уверен.

Например, с этим Enum EclEmma выделяет все зеленым цветом, за исключением объявления пакета:

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

Если я вытягиваю детали покрытия для класса, я вижу следующее:

alt text

Мой вопрос: какой лучший способ получить 100% -ый охват моих классов Enum с помощью EclEmma?

4b9b3361

Ответ 1

То, что вы видите, - это скрытый байт-код, создаваемый из-за перечисления.

Чтобы избавиться от этой проблемы, добавьте вызов методам values ​​() и valueOf() в перечислении, как упоминалось ранее Карлом Манастером и Питером Лори.

Ответ 2

Я согласен с другими плакатами, что 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);

Ключевое слово "поверхностное".

Ответ 3

Мы столкнулись с аналогичной проблемой, когда компилятор генерировал методы для перечислений, такие как values ​​(), как правило, не вызывались в нашем тестовом коде. Мы работали над проблемой, отфильтровывая номера наших объектов перечисления из нашего окончательного отчета.

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