Java Maven Emma对:$SWITCH_TABLE的意思是什么$
emma报告我的java代码几乎100%覆盖率,除了一个类中的一大块行(没有突出显示,只有类本身突出显示) 所讨论的“方法”如下所示:Java Maven Emma对:$SWITCH_TABLE的意思是什么$,java,maven,emma,Java,Maven,Emma,emma报告我的java代码几乎100%覆盖率,除了一个类中的一大块行(没有突出显示,只有类本身突出显示) 所讨论的“方法”如下所示: $SWITCH_TABLE$com$ ...STUFF... (): int [] 这可能是指什么?这似乎是某种自动生成的方法,我无法跟踪到任何实际的代码行/不知道如何测试它,等等 请帮忙。:) Emma可能会抱怨您不希望执行的代码部分。在这种情况下,我怀疑您有一个不需要调用的桥接方法 e、 g A类{ void方法(N){} } B类扩展了A类{ void方
$SWITCH_TABLE$com$ ...STUFF... (): int []
这可能是指什么?这似乎是某种自动生成的方法,我无法跟踪到任何实际的代码行/不知道如何测试它,等等
请帮忙。:) Emma可能会抱怨您不希望执行的代码部分。在这种情况下,我怀疑您有一个不需要调用的桥接方法 e、 g
A类{
void方法(N){}
}
B类扩展了A类{
void方法(整数n){}
}
在本例中,类B有两个方法。一个是
void-method(Integer)
,但从JVM的角度来看,它不会覆盖A中的方法,它会重载它,因此会生成另一个“桥”方法,即void-method(Number n){method((Integer)n);}
仔细查看STUFF
,它应该是一个枚举
枚举的表开关
在枚举上写入开关时,如:
STUFF stuff;
public String getWho() {
switch(this.stuff) {
case THINGIE: return "kid";
case MATERIAL: return "scientist";
default: return "people";
}
}
编译器根据Enum.ordinal
生成开关表,该“生成”在开关中调用的方法中完成,如:
switch( ($SWITCH_TABLE$com$...STUFF...())[this.stuff.ordinal] )
也许你只介绍了部分方法。如果只测试一次getWho()
,则生成的方法将错过一个分支,因为返回的int[]
是延迟初始化的。
另一种可能是生成的方法中的catch
es没有被覆盖,但您对此无能为力
来源和变体
我的主要源代码是并正在使用(我建议使用以下参数:-a-dead-noconv-nocast-noclass-v
)
本文提到了$SwitchMap$
,它几乎与$SWITCH\u TABLE$
相同,只是在方法内部使用了内部类中的静态初始化器。这可能是由于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
和一些反射。我想这是他们通常的另一个原因。awwww,酷。我来看看,这是一个扩展的情况,所以可能是这样的我是从.getClass().getDeclaredFields()
中得到的,我需要跳过它,我没有找到其他精确的方法,所以我想.getName().startsWith(“$SWITCH\u TABLE$”)
是最好的选择,对吗?和thx!:)我会和你一起去。Synthetic也会跳过access$000()
和其他您可能不感兴趣的内容。哦,酷,是的,我确实需要跳过这$0,我想可能有用吧!在描述中,他们只说“如果它是合成的,就返回”w/e lol,没有耐心研究w/e它的意思,现在就做thx!:)
@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
}
}
}