这可能是一个相当简单的问题,但我不知所措......
我有以下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要我测试的第四个选项是什么?
答案 0 :(得分:5)
你是对的,这段代码是短路的。它大致像这样编译成字节码(假设Java有goto):
if(TheEnum.A.equals(myEnum)) goto ok;
if(!TheEnum.B.equals(myEnum)) goto end;
ok:
// body of if statement
end:
因此,当JaCoCo分析字节码时,从它的角度来看,你有两个独立的检查:第一个if
和第二个if
,它们产生四个可能的分支。你可能会认为这是一个JaCoCo错误,但我想这并不是很容易解决这个问题并且不是很令人不安,所以你可以忍受它。
答案 1 :(得分:1)
如果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%的测试。
请注意,这可能会影响性能...我告诉过您! 同时隐藏所有这些决定可能适得其反!