艾玛对Enum类型的报道

时间:2010-12-22 18:26:00

标签: java eclipse code-coverage emma

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

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

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

如果我提取课程的覆盖范围详情,我会看到:

alt text

我的问题是,使用EclEmma对我的Enum课程进行100%覆盖的最佳方法是什么?

3 个答案:

答案 0 :(得分:54)

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

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

答案 1 :(得分: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);

关键词是“肤浅的”。

答案 2 :(得分:2)

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

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