Search code examples
javasonarqubejacocoshort-circuitingtest-coverage

Test coverage for if statement with logical or (||) - with Java's short circuiting, what's the forth condition JaCoCo wants me to cover?


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 for if(true || true) or if(true || false), as short circuit evaluation won't get that far...?

If so, what is the forth option JaCoCo/Sonar wants me to test for?


Solution

  • 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.