45

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

たとえば、この列挙型を使用すると、EclEmmaは、パッケージ宣言を除いて、すべてを緑色で強調表示します。

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

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

代替テキスト

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

4

3 に答える 3

57

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

この問題を取り除くには、CarlManasterとPeterLawreyが前述したように、列挙型のvalues()メソッドとvalueOf()メソッドへの呼び出しを追加します。

于 2010-12-28T19:40:10.310 に答える
10

私は他のポスターに同意します。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);

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

于 2013-06-06T19:27:28.437 に答える
2

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

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

于 2010-12-22T18:32:58.263 に答える