艾玛覆盖枚举types

我正在运行Eclipse的Emma插件EclEmma,覆盖率报告只显示了我定义的Enum的部分覆盖范围,尽pipe它显示Enum中唯一的值被覆盖。 我假设支持Enum的隐含方法有一个覆盖范围的差距,但我不太确定。

例如,对于这个Enum,除了包声明外,EclEmma以绿色突出显示了所有内容:

package com.blah; public enum UserRole { HAS_ACCESS } 

如果我拉上课程的覆盖范围,我看到这个:

替代文字

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

你看到的是由于枚举产生的一些隐藏的字节码。

为了摆脱这个问题,像Carl Manaster和Peter Lawrey先前提到的那样,在enum中添加对values()和valueOf()方法的调用。

我同意其他海报100%的代码覆盖率可能会被误导。 但是,我不得不承认,新编写的核心代码的覆盖率达到了100%。

幸运的是,由于所有的枚举类扩展了相同的“类”,所以你可以在朋友的反思中获得一点点帮助。

只需在类中添加以下静态方法,供您的testing人员使用[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); 

关键词是“表面的”。

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

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