为什么代码覆盖有时会计算方法名称或结束括号?

时间:2014-09-08 20:00:11

标签: java unit-testing junit code-coverage

为什么这些行如方法定义(带修饰符,方法名称,参数等)或右括号会将有时计入行覆盖?

Example1

在这个特定的例子中,它是一个构造函数方法,但它并不总是那样:

Example2

你能解释一下吗?

1 个答案:

答案 0 :(得分:3)

这取决于您使用的覆盖工具,但我见过一些与您的结果相符的内容。

据我所知,原因是抛出/提前返回与击中函数的结尾。

请注意,突出显示右括号的唯一方法不返回(任何内容),而是在函数末尾运行,因此触摸右括号(以及可能在那里发生的堆栈弹出)。对于构造函数也是如此,它没有显式地返回函数内的任何地方。

在其他示例中,最后一个突出显示的行是执行离开函数的位置。

您可以通过设置一个早期返回的方法并在收集覆盖范围时仅测试该情况来轻松地对此进行测试。用覆盖测试另一个(返回结束)的情况,并比较两者。希望第二个显示结束括号。

例如:

public class EarlyReturn {
    public static void whatHappens(final Boolean path) {
        System.out.println("Entering method...");

        if (path == null) {
           throw new IllegalArgumentException("Must have a path.");
        } else if (path) {
            System.out.println("Exiting early...");
            return;
        }

        System.out.println("Exiting normally...");
    }
}

使用:

@RunWith(JUnit4.class)
public class TestEarlyReturn {
    @Test
    public void testEarly() {
        EarlyReturn.whatHappens(true);
    }

    @Test
    public void testNormal() {
        EarlyReturn.whatHappens(false);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testThrow() {
        EarlyReturn.whatHappens(null);
    } 
}

您没有提到行/分支覆盖率指标,但在您的示例中,所有案例都应该有100%的覆盖率(我希望)。当然,这仍取决于工具及其取样方式。我的示例不应该有100%的行覆盖率,除非你同时运行两个测试。