繁体   English   中英

尽管经过测试,Jacoco 0.8.0 在所有开关情况下都标记抛出和中断

Jacoco 0.8.0 flagging throw and break in all switch cases despite tests

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在“Jacoco 0.8.0”上。 我有一个 switch 语句,其中包含所有情况的测试。 Jacoco 在 switch 语句中标记了每种情况下的 throw 和 break。 默认大小写和中断未标记。 为什么要标记这些?

我环顾四周,发现这样的帖子说以前的版本没有过滤 switch 语句: 为什么 JaCoCo 没有覆盖我的 String switch 语句?

但我正在运行此修复后的 0.8.0,问题略有不同。

MRE:

public class MyClass{

    public void myMethod(String let) {
           switch (let) {
               case "A":
                   throw new Exception();
                   break;

               default:
                   break;
           }
      }

}

每个测试:

@Test(expected = Exception.class)
    public void testMyMethodA() {
        MyClass class = new MyClass();
       class.myMethod("A");
    }

@Test(expected = Exception.class)
    public void testMyMethodDefault() {
        MyClass class = new MyClass();
       class.myMethod("Z");
    }

标志示例:

public class MyClass{

    public void myMethod(String let) {
[YELLOW]  switch (let) {
               case "A":
[RED]          throw new Exception();
[RED]          break;

               default:
                   break;
           }
      }

}

Jacoco 将 throw 语句和中断标记为未经测试。 它将开关标记为部分测试。 我希望这些都被覆盖。

1 个回复

首先你的 MRE

public class MyClass{

    public void myMethod(String let) {
           switch (let) {
               case "A":
                   throw new Exception();
                   break;

               default:
                   break;
           }
      }

}

无法编译

javac --version
javac 11.0.3

由于以下错误

javac MyClass.java
MyClass.java:7: error: unreachable statement
                   break;
                   ^
MyClass.java:6: error: unreported exception Exception; must be caught or declared to be thrown
                   throw new Exception();
                   ^
2 errors

如果你看一下JaCoCo 主页,你会注意到 0.8.0 已经快两年了,最新版本是0.8.4

JaCoCo 更改日志在https://www.jacoco.org/jacoco/trunk/doc/changes.html页面上的通常位置包含

发布 0.8.2 (2018/08/21)

  • javac 为java.lang.String值的switch语句生成的部分字节码现在在生成报告期间正确过滤掉了 (GitHub #730 )。

所以对于更正的例子

class Example {
    public void myMethod(String let) {
        switch (let) {
        case "A":
            throw new RuntimeException();
        default:
            break;
        }
    }

    public static void main(String[] args) {
        for (String s : new String[]{"A", "B"}) {
            try {
                new Example().myMethod(s);
            } catch (Exception ignore) {
            }
        }
    }
}

JaCoCo 0.8.4产生以下预期报告

javac Example.java -d classes

java -javaagent:jacoco-0.8.4/lib/jacocoagent.jar -cp classes Example

java -jar jacoco-0.8.4/lib/jacococli.jar report \
    jacoco.exec \
    --classfiles classes \
    --sourcefiles . \
    --html report

报告


根据经验并引用JaCoCo 发布公告

一如既往,我们建议您使用最新发布的版本

3 为什么在某些情况下,尽管进行了更新,但仍看不到来自线程的更新?

我正在阅读“ 有效的Java ”,在他谈论线程的这一章中,我进入了这个片段: 过了一会儿,他说了那段代码,但是如果没有同步,他说: 更令人惊讶的是,一个线程可能重复调用generateSerialNumber ,获得从零到n的序列号序列,然后另一个线程调用generateSer ...

4 didRangeBeacon在没有发现任何信标的情况下进行了调用

我注册了我自己的位置经理来监控和范围几个信标: 我的理解是,当找到一个或多个信标时,会调用此委托方法: 当我打开我的信标时,确实调用了这个委托方法,但是信标数组是空的。 我的灯塔没有列在那个数组中有什么理由吗? 这是一个截图来说明这种情况: 其他注意事项: ...

6 默认情况下,是否对经过gcc编译的程序进行了优化?

在大学期间,我了解到编译器优化了我们的代码,以使可执行文件更快。 例如,当在一个点之后不使用变量时,将不会计算该变量。 因此,据我所知,这意味着,如果我有一个调用排序算法的程序,并且打印了算法的结果,则该算法将运行。 但是,如果未打印任何内容(或在其他任何地方使用了任何内容),则该程序 ...

8 在这种情况下,使用 forEach 对 Firebase 进行了多少次读取?

最近我开始将 firebase(RTDB) 用于 WEB(JS),而且我对 JS 还是很陌生。 我想做一个包含国家/地区、特定日期和时间信息的小型测试/游乐场应用程序。 我在 Firebase 中有以下结构: 这个想法是当用户从日历中选择日期以循环日期并获取所有国家的小时和“信息”。 我设法使 ...

9 在没有jQuery的情况下切换Google Maps标记

我正在使用Google Maps API v.3从XML文件显示位置标记和有关位置的信息,该XML文件是在从MySQL数据库加载页面时构建的(mysql-> xml-> Google Maps API)。 我需要知道的是如何根据我的复选框的ID是否与该行上定义的变量的值匹配来打 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM