为了账号安全,请及时绑定邮箱和手机立即绑定

尽管进行了测试,Jacoco 0.8.0 仍然在所有 switch 情况下标记 throw

尽管进行了测试,Jacoco 0.8.0 仍然在所有 switch 情况下标记 throw

慕的地8271018 2023-08-09 15:34:55
我正在使用“Jacoco 0.8.0”。我有一个 switch 语句,其中包含所有情况的测试。Jacoco 在 switch 语句中标记每种情况下的 throw 和 Break。默认情况下的情况和中断是未标记的。为什么要标记这些?但我运行的是修复后的 0.8.0,问题略有不同。再次: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 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

首先你的 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

包含

版本0.8.2 (2018/08/21)

  • 现在,在生成报告期间,可以正确过滤掉 javac 为针对少量情况的值的switch语句生成的部分字节码(GitHub #730 )。java.lang.String

所以对于更正的例子

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

https://img2.sycdn.imooc.com/64d341dd00015d8206300450.jpg

查看完整回答
反对 回复 2023-08-09
  • 1 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号