有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jacoco 0.8.0标记在所有开关情况下抛出和中断,尽管进行了测试

我在“Jacoco 0.8.0”节目中。我有一个switch语句,对所有情况都进行了测试。 Jacoco在switch语句中标记每种情况下的抛出和中断。默认大小写和break未标记。它为什么要标记这些

我环顾四周,发现像这样的帖子说,以前的版本没有对switch语句进行过滤: Why is JaCoCo not covering my String switch statements?

但我运行的是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将抛出语句和中断标记为未经测试。它将开关标记为已部分测试。我希望这些都能被涵盖


共 (1) 个答案

  1. # 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 homepage,你会发现0.8.0已经有两年的历史了,最新版本是0.8.4

    JaCoCo changelog在https://www.jacoco.org/jacoco/trunk/doc/changes.html页的通常位置包含

    Release 0.8.2 (2018/08/21)

    • Part of bytecode that javac generates for switch statement on java.lang.String values with a small number cases is now correctly filtered out during generation of report (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
    

    report


    根据经验和引用JaCoCo release announcements

    as always we recommend you to use latest released version