6

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

我有一个如下的 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)or if(true || false),因为短路评估不会那么远......?

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

4

2 回答 2

7

你是对的,这段代码是短路的。它大致像这样编译成字节码(假设Java有goto):

if(TheEnum.A.equals(myEnum)) goto ok;
if(!TheEnum.B.equals(myEnum)) goto end;
ok:
   // body of if statement
end:

因此,当 JaCoCo 分析字节码时,从它的角度来看,您有两个独立的检查: firstif和 second if,它们会生成四个可能的分支。你可能会认为这是一个 JaCoCo 错误,但我想要健壮地修复它并不容易,也不是很烦人,所以你可以忍受它。

于 2015-07-21T17:57:40.207 回答
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% 的测试。

请注意,这可能会影响性能......我告诉过你!隐藏所有这些决定也可能适得其反!

于 2020-04-24T14:06:59.783 回答