有没有一种简单的方法来判断我错过哪个分支?即我有一些像这样的代码:
if (x || y) {
// do stuff
}
在重点介绍中,Eclipse中有一个黄点表示:
4个分支中的1个错过了
但我想知道哪个分支缺失。
答案 0 :(得分:17)
x
和y
可以是什么?
true || true
true (由于JVM优化而未涵盖:如果第一个条件为true
,则由于短路评估而不会评估第二个条件)< / LI>
false || true
true true || false
true false || false
false 答案 1 :(得分:9)
Eclemma的父母open issue的github repo上的jacoco表明这样的功能实际上有点难以包含。
然而,即使没有Eclemma功能,如果目标只是找出在特定情况下错过的分支,您可以检测代码以跟踪。最简单的例子是旧式的印刷语句:
if (x || y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
然后查看输出并查看实际命中的分支(例如java ... | grep "BRANCH:" | sort | uniq
)。 (我知道,这并不十分令人满意。)
答案 2 :(得分:5)
答案是true|| true
未涵盖。
这是因为一旦JVM发现第一个条件为真,那么它将不会运行第二个条件(它已经过优化),这意味着代码的一部分永远不会运行。
正如Maroun所说,4个分支中的3个将允许条件通过。如果您仍然担心代码覆盖率,则可以将条件重构为&&
而不是||
。
(x || y)
与(!(!x && !y))
相同,这样您就可以测试所有条件,因为现在只有三个分支。
条件的原始形式经常出现在保护声明中:
if (obj == null || obj.hasError())
{
throw new RuntimeException();
}
这绝不允许您检查obj
是否为null
并且有错误,因为它会抛出空指针异常。
如果代码覆盖率很重要,那么只需使用此表单:
if (!(obj != null && !obj.hasError()))
{
throw new RuntimeException();
}
答案 3 :(得分:4)
有一个非常简单的方法 - 只需将每个逻辑谓词放在单独的行中,如下所示:
if (x
|| y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
现在当你运行analisys时,标记应直接指向错过的分支。在您完成后,您可以正确的方式重新格式化代码。
HTH
答案 4 :(得分:0)
if
块中的嵌套语句或扩展x
或y
谓词的语句中可能存在隐式分支。
阅读本文: http://emma.sourceforge.net/faq.html#q.fractional.examples
答案 5 :(得分:0)
以下表达式的结果是什么?
true || true
是 true true || false
是 true false || true
是 true false || false
是 false 如果在第一种和第二种情况下,当您将第一个参数设置为 TRUE 时,则无需检查第二个参数。
true && true
是 true true && false
是 false false && true
是 false false && false
是 false 或者如果您看到使用 AND 运算符的情况,则如果第一个参数为 FALSE ,则无需检查第二个参数。
因此,您将永远无法检查4个分支中的1个分支。
答案 6 :(得分:0)
要获得全面介绍,避免编译器的隐式选择,您必须将if语句重写为两个as
if (x) {
// do stuff
} else if (y) {
// do the same stuff
}
这将获得完整的报道,但将被正确标记为冗余代码。看到问题后,我宁愿使用黄线,也不愿将此凌乱的结构添加到代码中。