Mic*_*udy 4 java junit unit-testing code-coverage
为什么像方法定义(带有修饰符、方法名称、参数等的行)或右括号这样的行有时会计入行覆盖率?
在这个特定的示例中,它是一个构造函数方法,但并不总是这样:
你能解释一下吗?
这取决于您使用的覆盖工具,但我见过一些与您的结果相符的工具。
据我所知,原因是抛出/提前返回与到达函数末尾。
请注意,突出显示右大括号的唯一方法不会返回(任何内容),而是从函数末尾运行并因此触及右大括号(以及可能发生在那里的堆栈弹出)。构造函数也是如此,它不会显式返回函数内的任何位置。
在其他示例中,最后突出显示的行是执行离开函数的位置。
您可以通过设置提前返回的方法并在收集覆盖率时仅测试该情况来轻松测试这一点。测试另一种(从末尾返回)情况的覆盖率,并比较两者。希望第二个显示突出显示的右大括号。
例如:
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...");
}
}
Run Code Online (Sandbox Code Playgroud)
和:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
您没有提到线路/分支覆盖率指标,但在您的示例中,所有情况都应具有 100% 的覆盖率(我希望)。当然,这仍然取决于工具及其采样方式。我的示例不应具有 100% 的线路覆盖率,除非您同时运行这两个测试。