使用逻辑或 (||) 测试 if 语句的覆盖率 - Java 短路,JaCoCo 要我覆盖的第四个条件是什么?
Test coverage for if statement with logical or (||) - with Java's short circuiting, what's the forth condition JaCoCo wants me to cover?
这可能是一个相当简单的问题,但我不知所措...
我有一个如下的 if 语句:
if(TheEnum.A.equals(myEnum) || TheEnum.B.equals(myEnum))
TheEnum
可以是 A
、B
、C
、... G
(不止 4 个选项)。
JaCoCo (SONAR) 告诉我这里可以涵盖四个条件。
那些是哪些?
在这种情况下,我基本上不能测试整个集合吗
if(true || not_evaluated) => true
if(false || true) => true
if(false || false) => false
我很确定我不能专门测试
if(true || true)
或
if(true || false)
,
因为短路评估不会那么远...?
如果是这样,JaCoCo/Sonar 要我测试的第四个选项是什么?
你没看错,这段代码短路了。它被大致像这样编译成字节码(假设 Java 已经转到):
if(TheEnum.A.equals(myEnum)) goto ok;
if(!TheEnum.B.equals(myEnum)) goto end;
ok:
// body of if statement
end:
因此,当 JaCoCo 分析字节码时,从它的角度来看,您有两个独立的检查:第一个 if
和第二个 if
,它们生成四个可能的分支。你可能认为这是一个 JaCoCo 错误,但我想要稳健地修复这个问题并不容易,也不是很令人不安,所以你可以接受它。
如果 100% 的分数比什么都重要...
...使用这种方法:
if (Boolean.logicalOr(TheEnum.A.equals(myEnum), TheEnum.B.equals(myEnum))) {
...
或者使用二进制或者
if (TheEnum.A.equals(myEnum) | TheEnum.B.equals(myEnum)) {
...
您可以根据需要嵌套调用,或使用自己的 or
函数:
if (or(TheEnum.A.equals(myEnum), TheEnum.B.equals(myEnum))) {
...
public static boolean or(Boolean... vals) {
for (Boolean v : vals) {
if (Boolean.TRUE.equals(v))
return true;
}
return false;
}
使用独立的可测试函数 or
将测试 100%。
请注意,这可能会影响性能...我告诉过你!
隐藏所有这些决定可能会适得其反!
这可能是一个相当简单的问题,但我不知所措...
我有一个如下的 if 语句:
if(TheEnum.A.equals(myEnum) || TheEnum.B.equals(myEnum))
TheEnum
可以是 A
、B
、C
、... G
(不止 4 个选项)。
JaCoCo (SONAR) 告诉我这里可以涵盖四个条件。 那些是哪些? 在这种情况下,我基本上不能测试整个集合吗
if(true || not_evaluated) => true
if(false || true) => true
if(false || false) => false
我很确定我不能专门测试
if(true || true)
或
if(true || false)
,
因为短路评估不会那么远...?
如果是这样,JaCoCo/Sonar 要我测试的第四个选项是什么?
你没看错,这段代码短路了。它被大致像这样编译成字节码(假设 Java 已经转到):
if(TheEnum.A.equals(myEnum)) goto ok;
if(!TheEnum.B.equals(myEnum)) goto end;
ok:
// body of if statement
end:
因此,当 JaCoCo 分析字节码时,从它的角度来看,您有两个独立的检查:第一个 if
和第二个 if
,它们生成四个可能的分支。你可能认为这是一个 JaCoCo 错误,但我想要稳健地修复这个问题并不容易,也不是很令人不安,所以你可以接受它。
如果 100% 的分数比什么都重要... ...使用这种方法:
if (Boolean.logicalOr(TheEnum.A.equals(myEnum), TheEnum.B.equals(myEnum))) {
...
或者使用二进制或者
if (TheEnum.A.equals(myEnum) | TheEnum.B.equals(myEnum)) {
...
您可以根据需要嵌套调用,或使用自己的 or
函数:
if (or(TheEnum.A.equals(myEnum), TheEnum.B.equals(myEnum))) {
...
public static boolean or(Boolean... vals) {
for (Boolean v : vals) {
if (Boolean.TRUE.equals(v))
return true;
}
return false;
}
使用独立的可测试函数 or
将测试 100%。
请注意,这可能会影响性能...我告诉过你! 隐藏所有这些决定可能会适得其反!