Java Maven Emma对:$SWITCH_TABLE的意思是什么$

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方

emma报告我的java代码几乎100%覆盖率,除了一个类中的一大块行(没有突出显示,只有类本身突出显示)

所讨论的“方法”如下所示:

$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
        }
    }
}