艾玛对枚举类型的覆盖

2022-09-01 00:33:13

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

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

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

如果我拉出该类的覆盖范围详细信息,我会看到以下内容:

alt text

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


答案 1

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

为了解决这个问题,请在枚举中添加对 values() 和 valueOf() 方法的调用,如 Carl Manaster 和 Peter Lawrey 之前提到的。


答案 2

我同意其他海报的观点,即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);

关键词是“肤浅”。


推荐