java - 使用逻辑或 (||) 测试 if 语句的覆盖率 - 对于 Java 的短路,JaCoCo 希望我覆盖的第四个条件是什么?

标签 java sonarqube jacoco short-circuiting test-coverage

这可能是一个相当简单的问题,但我不知所措......

我有一个如下的 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)如果(真||假), 因为短路评估不会走那么远......?

如果是这样,JaCoCo/Sonar 要我测试的第四个选项是什么?

最佳答案

你是对的,这段代码短路了。它被大致像这样编译成字节码(假设 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 错误,但我想要稳健地修复这个问题并不容易,而且也不会很令人不安,因此您可以接受它。

关于java - 使用逻辑或 (||) 测试 if 语句的覆盖率 - 对于 Java 的短路,JaCoCo 希望我覆盖的第四个条件是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31546047/

相关文章:

android - 忽略 jacoco 测试覆盖率中的失败测试

java - 使用 gradle 从 jacoco 测试覆盖范围中删除一些 java 文件

java - 数据库中的时间戳与文本文件中的时间戳格式不同

java - 错误 : local variable a is accessed from within inner class; needs to be declared final

css - Font-Awesome 字体的通用字体系列应该是什么?

java - SonarQube:java构造函数枚举中是否应该允许魔数(Magic Number)

Android Studio 3.0 gradle 3.0.0-beta2,打破 Kotlin 单元测试覆盖率?

java - 安卓小部件

Java Discord Api 移动用户

java - Sonar 项目集成