web-dev-qa-db-ja.com

列挙型のエマカバレッジ

EclipseのEmmaプラグインであるEclEmmaを実行しています。カバレッジレポートには、定義したEnumの部分的なカバレッジしか表示されません。 Enumをサポートする暗黙のメソッドにはカバレッジギャップがあると想定していますが、よくわかりません。

たとえば、このEnumの場合、EclEmmaはパッケージ宣言を除いてすべてを緑色で強調表示します。

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

クラスのカバレッジの詳細を取得すると、次のようになります。

alt text

私の質問は、EclEmmaを使用してEnumクラスを100%カバーするための最良の方法は何ですか?

44
Javid Jamae

あなたが見ているものは、列挙のために生成されているいくつかの隠されたバイトコードです。

この問題を取り除くには、前にカールマナスターとピーターローリーが述べたように、enumのvalues()メソッドとvalueOf()メソッドへの呼び出しを追加します。

56
deterb

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);

キーワードは「表面的」です。

10
Darren

同様の問題が発生し、values()などの列挙型のコンパイラー生成メソッドが、通常、テストコードで呼び出されませんでした。最終レポートから列挙オブジェクトの数をフィルタリングすることにより、問題を回避しました。

これが、完全性の尺度としてコードカバレッジを使用したくない理由です。より良い指標を考えたら、お知らせします。 :)

2
dhable