2010-12-22 29 views
40

私はEclipseのEmmaプラグインであるEclEmmaを実行していますが、カバレッジレポートには、Enumの唯一の値が表示されていますが、私はEnumを取り戻す暗黙のメソッドのカバレッジ・ギャップがあると仮定していますが、私はあまりよく分かりません。Enumの種類Enumの種類

たとえば、この列挙型で、EclEmmaは、パッケージ宣言を除いて、緑のすべてを強調:

package com.blah; 

public enum UserRole { 
HAS_ACCESS 
} 

私はクラスのカバレッジの詳細をプルアップした場合、私はこれを参照してください。

alt text

私の質問は、EclEmmaを使用してEnumクラスで100%カバレッジを取得する最良の方法は何ですか?

+0

Emmaはあなたが逃したことの詳細を教えてくれませんか?それは奇妙に思える。 –

+0

私は以前にそこにいたので、私の2セントは、私はこのトラップに落ちて私の開発者を見てきました。あなたが100%のコードカバレッジに達すると、(あなたが望むよりも)もっと情熱的な気がします。これはちょうど時間の無駄です。カバレッジツールのレポートは、コード改善の機会を特定する(または技術部門を削減する)ために使用するだけでよく、修正が必要であるとみなすべきではありません。 –

+0

私は同意しますが、カバレッジを得る簡単な方法があれば、それを無視するつもりはありません。カバレッジレポートにはノイズが含まれているため、実際の問題を解決するためにフィルタリングする必要はありません。コンパイラの警告がないのが好きだと思う。私はそれらをすべて修正する必要はありませんが、重要ではない新しいものがあることを確認するために重要度の低いものをフィルタリングしたくありません。ところで、あなたの答えは無回答であり、コメントとしての方がいいでしょう。 –

答えて

51

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

この問題を解決するには、前述のCarl ManasterとPeter Lawreyが述べたように、enumのvalues()メソッドとvalueOf()メソッドの呼び出しを追加します。

+11

私が必要としたのは、valueOfを1回呼び出すだけで100%のカバレッジが得られることでした。私はそれ以上のことをしなければならないと思った。 –

+0

私は 'enum'と' classes'で同じ問題に直面していました。私は 'enum 'の場合に解決できました。しかし、私のコードカバレッジは 'package'という名前でカバーしていません。任意の提案は役に立ちます – Amolb

+0

@Amolbあなたの最良の賭けは、関連するすべての詳細と新しい質問をすることです。これは明示的に 'enum'であり、' package'ではありませんでした。 – deterb

2

コンパイラがvalues()のような列挙型のメソッドを生成したのと同じ問題が発生しました。通常、テストコードでは呼び出されませんでした。私たちは、最終報告書からenumオブジェクトの数をフィルタリングすることで問題を解決しました。

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

+3

これを解消する:おそらく、テストレポートのノイズを取り除くために、任意の列挙体を取り、固有のメソッドを実行するジェネリックなテストメソッドを書くことができます。これは少し危険です。もしこれをすべてのことでやったなら、100%のテストカバレッジとテスト価値はありませんが、あなたのニーズを満たすかもしれないと思います。 –

+2

exerciseEnum(MyEnum.class)で呼び出すことができるvalues()およびvalueOf()を呼び出す一般的なenumエクササイザを追加できます。 –

+1

フィードバックに感謝します。あなたはカバレッジギャップの理由について正しいですが、私はカバレッジレポートからEnumを無視することが正しい方法だとは思わないのです。 –

9

私は、100%コードカバレッジが誤っている可能性がある他のポスターに同意します。 しかし、私は、新たに書かれたコアコードに100%のカバレッジを得ることの満足を認めなければなりません。

幸運にも、すべての列挙型が同じ 'クラス'を拡張しているので、あなたの友人のリフレクションの助けを借りて100%達成することができます。

[EnumTypeName] .classをパラメータとして使用して、テスターが呼び出すクラスに次の静的メソッドを追加するだけです。

Shared.superficialEnumCodeCoverage(UserRole.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); 
    } 
    } 

は、「共有」と呼ばれるクラスで実装された、あなただけの各列挙のためにこの行を含める必要があります。

+5

反射は最悪の友達です。背中合わせ。 –

+2

これは、 'toString'メソッドがenumクラスでオーバーライドされていない場合にのみ機能します。その場合は、代わりに '.name'を呼び出さなければなりません(これはenum型の' o'(少なくとも 'Enum 'の型)を必要とします)。 –

+0

列挙型にフィールドがない場合、カバレッジはまだ不完全です – datahaki