声纳无法覆盖调用异常抛出函数的分支

Tha*_*ran 5 java junit4 jacoco sonarqube

我正在为我的项目编写代码覆盖率并遇到奇怪的行为。我有这样的功能

public void testException(int i) throws Exception {
    if (i == 0) {
        throw new Exception("exception");
    }
}
Run Code Online (Sandbox Code Playgroud)

和测试用例

@Test
public void testException() {
    try {
        mapper.testException(0);
        fail("Wrong");
    } catch (Exception ex) {
        assertEquals("exception", ex.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

通过maven()运行测试用例后mvn sonar:sonar,该分支将被Sonar覆盖。但是,如果测试的函数是这样的

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

public void throwException() throws Exception {
    throw new Exception("exception");
}
Run Code Online (Sandbox Code Playgroud)

那么if虽然函数的内部throwException实际上被执行了,但分支没有被覆盖。有办法克服这个问题吗?我需要 100% 完成全班课程

Tha*_*ran 1

看起来代码没有被覆盖的原因在常见问题解答中

有异常的代码显示没有覆盖。为什么?

JaCoCo 使用所谓的探针确定代码执行。探针被插入到控制流的某些位置。当执行后续探测时,代码被视为已执行。如果出现异常,这样的指令序列会在中间的某个位置中止,并且不会标记为已执行。

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