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

标签 java maven emma

我的 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/

相关文章:

java - Web 浏览器在设备中显示为一条线

java - Maven 未检测到 Reactor 构建中模块的依赖关系?

java - 从 jar 执行中获取 Java 覆盖率

java - JSoup 如何获取所有回复

java配置/参数传递设计

java - Play Framework with Eclipse 启用建议并删除错误

java - 自 3.1.0 以来,使用 Maven 生成 QueryDSL 类失败

java - 在基于 Visual Studio Code Maven 的 Java 项目中设置类路径

java - 如何获得 Java 中各个测试的代码覆盖率

Java 代码质量趋势和统计数据(LOC、方法等)趋势