45

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

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

package com.blah;

public enum UserRole {
 HAS_ACCESS
}

如果我调出课程的覆盖细节,我会看到:

替代文字

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

4

3 回答 3

57

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

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

于 2010-12-28T19:40:10.310 回答
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);

关键词是“肤浅的”。

于 2013-06-06T19:27:28.437 回答
2

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

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

于 2010-12-22T18:32:58.263 回答