Java Sonar无法覆盖调用异常抛出函数的分支

Java Sonar无法覆盖调用异常抛出函数的分支,java,junit4,sonarqube,jacoco,Java,Junit4,Sonarqube,Jacoco,我正在为我的项目编写代码覆盖率,并经历了一种奇怪的行为。我有一个这样的函数 public void testException(int i) throws Exception { if (i == 0) { throw new Exception("exception"); } } public void testException(int i) throws Exception { if (i == 0) { throwExceptio

我正在为我的项目编写代码覆盖率,并经历了一种奇怪的行为。我有一个这样的函数

public void testException(int i) throws Exception {
    if (i == 0) {
        throw new Exception("exception");
    }
}
public void testException(int i) throws Exception {
    if (i == 0) {
        throwException();
    }
}

public void throwException() throws Exception {
    throw new Exception("exception");
}
以及测试用例

@Test
public void testException() {
    try {
        mapper.testException(0);
        fail("Wrong");
    } catch (Exception ex) {
        assertEquals("exception", ex.getMessage());
    }
}
通过maven(
mvn sonar:sonar
)运行测试用例后,分支将被sonar覆盖。但是,如果测试的函数是这样的

public void testException(int i) throws Exception {
    if (i == 0) {
        throw new Exception("exception");
    }
}
public void testException(int i) throws Exception {
    if (i == 0) {
        throwException();
    }
}

public void throwException() throws Exception {
    throw new Exception("exception");
}

然后,
if
分支未被覆盖,尽管实际上执行了
throweexception
函数的内部。有没有办法克服这个问题?我需要涵盖100%的课程

看起来没有涵盖代码的原因在

有异常的代码不显示覆盖范围。为什么?

JaCoCo使用所谓的探测来确定代码的执行。探针是 在某些位置插入控制流。代码是 执行后续探测时视为已执行。在里面 在异常情况下,该指令序列被中止 在中间的某个地方,没有标记为执行。


我仍然不明白为什么直接投掷的覆盖范围仍然出现在sonar上

您使用的是哪个版本的SonarQube?@CSchulz:我同时使用了4.2和4.5