我的 java 代码得到了 emma 报告的几乎 100% 的覆盖率,除了一个类中的一大块行(没有突出显示,只有类本身突出显示)。
有问题的“方法”被列为:
$SWITCH_TABLE$com$ ...STUFF... (): int []
这可能指的是什么?这似乎是某种自动生成的方法,我无法追踪到任何实际的代码行/无法弄清楚如何测试它,等等。
请帮忙。 :)
最佳答案
仔细看看STUFF
,它应该是一个枚举。
枚举的表开关
当您在枚举上编写开关时,例如:
STUFF stuff;
public String getWho() {
switch(this.stuff) {
case THINGIE: return "kid";
case MATERIAL: return "scientist";
default: return "people";
}
}
编译器根据Enum.ordinal
生成开关表,该“生成”是在switch
内调用的方法中完成的,例如:
switch( ($SWITCH_TABLE$com$...STUFF...())[this.stuff.ordinal] )
也许您只部分地了解了该方法。如果仅测试 getWho()
一次,则生成的方法会错过分支,因为返回的 int[]
是延迟初始化的。
另一种可能性是生成方法中的 catch 没有被覆盖,但您对此无能为力。
来源和变体
我的主要来源是this article on enum并玩弄 JAD (我建议使用以下参数:-a -dead -noconv -nocast -noclass -v
)。
文章中提到了$SwitchMap$
,它与$SWITCH_TABLE$
几乎相同,只是内部类中使用了static intializer
方法。这可能是由于旧版本的 Java 或编译器差异造成的。
100%
如果你真的决心达到 100%,你可以修改并通过反射调用它:
@Test
public void testSwitches() {
for(Method m : NotCovered.class) {
if(m.getName().startsWith("$SWITCH_TABLE$")) {
m.setAccessible(true);
m.invoke(null); // one for lazy init
m.invoke(null); // one for quick returning the initialized value
}
}
}
我没有尝试此代码,也不建议使用它,只是一个示例。
在我早期的日子里,我曾经尝试过在专业环境中达到 100%,而在最后的 12% 中,我需要大量的测试编码和模拟。对于最后 3%,我需要 PowerMock 和一些反射(reflection)。我认为这是他们通常set the bar at 80-90%的另一个原因.
关于java - Maven Emma 的 : $SWITCH_TABLE$ 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12383881/