Java 枚举类型的Emma覆盖率

Java 枚举类型的Emma覆盖率,java,eclipse,code-coverage,emma,Java,Eclipse,Code Coverage,Emma,我正在运行Eclema,Eclipse的Emma插件,覆盖率报告仅显示我定义的枚举的部分覆盖率,即使它显示枚举中唯一被覆盖的值。我假设支持枚举的隐含方法存在覆盖率差距,但我不太确定 例如,使用此枚举,EclEmma以绿色突出显示所有内容,但包声明除外: package com.blah; public enum UserRole { HAS_ACCESS } 如果我调出课程的覆盖范围详细信息,我会看到: 我的问题是,使用EclEmma实现枚举类100%覆盖的最佳方法是什么?我们遇到了一个

我正在运行Eclema,Eclipse的Emma插件,覆盖率报告仅显示我定义的枚举的部分覆盖率,即使它显示枚举中唯一被覆盖的值。我假设支持枚举的隐含方法存在覆盖率差距,但我不太确定

例如,使用此枚举,EclEmma以绿色突出显示所有内容,但包声明除外:

package com.blah;

public enum UserRole {
 HAS_ACCESS
}
如果我调出课程的覆盖范围详细信息,我会看到:


我的问题是,使用EclEmma实现枚举类100%覆盖的最佳方法是什么?

我们遇到了一个类似的问题,即编译器生成的枚举方法(如values())通常不会在测试代码中被调用。我们通过从最终报告中过滤枚举对象的数量来解决这个问题


这就是为什么我不喜欢使用代码覆盖率来衡量完整性。当我想到一个更好的指标时,我会让你知道。:)

您看到的是由于枚举而生成的一些隐藏字节码


要解决此问题,请在枚举中添加对values()和valueOf()方法的调用,正如Carl Manaster和Peter Lawrey前面提到的那样。

我同意其他海报所说的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);
    }
  }

关键词是“肤浅”

套用这种方法:也许您可以编写一个通用的测试方法,它接受任何枚举并练习其固有的方法,以消除测试报告噪音。这有点冒险-如果你对所有东西都这样做,你会有100%的测试覆盖率,没有测试值-但我认为它可能会满足你的需要。你可以添加一个通用的枚举练习器,它可以调用values()和valueOf(),你可以用exerciseEnum(MyEnum.class)调用它。谢谢你的反馈。关于覆盖率差距的原因,您是对的,但我不认为忽略覆盖率报告中的枚举是正确的做法。@Carl-关于风险,您是对的,直接测试每个枚举的方法可能更好,我发现我所需要做的只是调用valueOf,我就得到了100%的覆盖率。我想我还需要做更多的工作。我在
enum
classes
方面也面临着同样的问题。我能够解决
enum
的情况。但是我的代码覆盖范围不包括
名称。任何建议都将是错误的helpful@Amolb你最好的办法是问一个新问题,包括所有相关的细节。这篇文章是关于
enum
s的,而不是
package
s。反射是最糟糕的朋友。backstabber。只有在enum类中未重写
toString
方法时,此方法才有效。在这种情况下,您将不得不调用
.name
(这就需要使用枚举类型的
o
(或者至少是
enum
)。如果枚举没有任何字段,则覆盖率仍然不完整。我以前在那里只花了2美分,我看到我的开发人员落入了这个陷阱。感觉您更热情(超出预期)达到100%的代码覆盖率。这只是浪费时间。覆盖率工具报告应仅用于确定代码改进机会(或减少技术部门)而且不应该被视为必须修复。Emma没有告诉你你错过了什么的细节吗?这似乎有点奇怪。我同意,但如果有一个简单的方法来获得覆盖率,我不会忽略它。覆盖率报告上的噪音,我宁愿不必过滤以获得真正的问题。我认为这就像没有任何编译器警告一样。我不必全部修改,但我不想通过筛选不太重要的内容来发现我有一个非常重要的新答案。顺便说一句,你的答案是非答案,最好作为评论。同意……我希望我现在可以将其移动到评论中……如果这是评论,我没想太多;-)我同意,但你只能用“它有100%的测试覆盖率”这句话来推销你的代码/框架/任何东西,如果它真的有。悲伤但真实+1.
Shared.superficialEnumCodeCoverage(UserRole.class);