This is probably a rather simple question, but I'm at a loss...
I have an if statement like the following:
if(TheEnum.A.equals(myEnum) || TheEnum.B.equals(myEnum))
TheEnum
can be A
, B
, C
, ... G
(more than just 4 options).
JaCoCo (SONAR) tells me that there are four conditions I can cover here.Which ones are those?Isn't the entire set I can test for in this instance essentially
if(true || not_evaluated) => true
if(false || true) => true
if(false || false) => false
I'm pretty sure I can't specifically test forif(true || true)
orif(true || false)
,as short circuit evaluation won't get that far...?
If so, what is the forth option JaCoCo
You are right, this code is short-circuiting. It's compiled into bytecode roughly like this (assuming Java has goto):
if(TheEnum.A.equals(myEnum)) goto ok;
if(!TheEnum.B.equals(myEnum)) goto end;
ok:
// body of if statement
end:
So as JaCoCo analyzes the bytecode, from its point of view you have the two independent checks: first if
and second if
, which generate four possible branches. You may consider this as a JaCoCo bug, but I guess it's not very easy to fix this robustly and it is not very disturbing, so you can live with it.
If the 100% score matters more than anything else...... use this approach:
if (Boolean.logicalOr(TheEnum.A.equals(myEnum), TheEnum.B.equals(myEnum))) {
...
Or use the binary or
if (TheEnum.A.equals(myEnum) | TheEnum.B.equals(myEnum)) {
...
You may nest the calls as deep as you like, or use an own or
function:
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;
}
Using a standalone testable function or
will test 100% of it.
Note that this may affect the performance... I told you!Also hiding all these decisions may backfire! 我有一个if语句,如下所示:if(TheEnum.A.equals(myEnum)