Эмма покрытие на типах Enum - PullRequest
44 голосов
/ 22 декабря 2010

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

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

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

Если я найду детали покрытия для класса, я увижу это:

alt text

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

Ответы [ 3 ]

55 голосов
/ 28 декабря 2010

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

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

10 голосов
/ 06 июня 2013

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

Ключевое слово «поверхностный».

2 голосов
/ 22 декабря 2010

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

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

...