艾玛对Enum类型的报道

Jav*_*mae 44 java eclipse code-coverage emma

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

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

package com.blah;

public enum UserRole {
 HAS_ACCESS
}
Run Code Online (Sandbox Code Playgroud)

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

替代文字

我的问题是,使用EclEmma在我的Enum课程上获得100%覆盖率的最佳方法是什么?

det*_*erb 55

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

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

  • 我发现我需要做的只是一次调用valueOf,我得到100%的覆盖率.我以为我不得不做更多的事情. (11认同)

小智 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);
    }
  }
Run Code Online (Sandbox Code Playgroud)

假设这个静态函数是在一个名为"Shared"的类中实现的,你只需要为每个枚举包含这一行:

Shared.superficialEnumCodeCoverage(UserRole.class);
Run Code Online (Sandbox Code Playgroud)

关键词是"肤浅的".

  • 反思是最糟糕的朋友.一个背刺者. (5认同)
  • 这仅适用于在enum类中未覆盖`toString`方法的情况.在这种情况下,你将不得不调用`.name`(这使得必须有一个枚举类型的`o`(或者至少是`Enum <?>`类型). (2认同)