gpt4 book ai didi

java - Maven Emma : $SWITCH_TABLE$ 是什么意思

转载 作者:行者123 更新时间:2023-12-04 05:32:39 49 4
gpt4 key购买 nike

我得到了 emma 为我的 Java 代码报告的几乎 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生成的方法中的 es 没有被覆盖,但您对此无能为力。

来源和变体

我的主要来源是 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/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com