简化单元测试的多个if-else语句

时间:2015-06-09 22:24:30

标签: java if-statement

我正在编写一些java代码来通过if-else检查多个条件。代码工作正常,但很难进行单元测试。

读取包含关键字conditionOneconditionTwo或其他关键字的行。 hasConditionOneEnabledhasConditionTwoEnabled是布尔值。

我的真实代码比提供示例有更多else if个语句。 有人可以帮忙吗?或者给我一些提示如何缩短代码然后我可以更轻松地编写单元测试?感谢

boolean a = false;
boolean b = false;


if(line.contains("conditionOne")){
    if(hasConditionOneEnabled){
        a = true;
    }else{
        b = true;
    }
}else if (line.contains("conditionTwo")){
    if(hasConditionTwoEnabled){
        a = true;
    }else{
        b = true;
    }
}else{
    a = true;
    b = true;
}


if(a && b){
    // do something 1
}else if(!a && b){
    // do something 2
}else if(a && !b){
    // do something 3
}else{
    //both false, do nothing
}

4 个答案:

答案 0 :(得分:2)

在if-else语句集之后,

a和b不能同时为false。 在前两个if变量中,a将具有与相应的hasConditionXXEnabled相同的值,而b将被设置为相反的值。默认的else将两者都设置为true。

请考虑以下代码:

a = true;
b = true;

if(line.contains("conditionOne")){
    a = hasConditionOneEnabled;
    b = !a;
}
else if(line.contains("conditionTwo")){
    a = hasConditionTwoEnabled;
    b = !a;
}

if(a && b){        
    // do something 1
}
else if(b){
    // do something 2
}
else{
    // do something 3
}

答案 1 :(得分:0)

// test it on different line String input and different int value returned...
int xxx(String line) {
    if(line.contains("conditionOne")){
        status = hasConditionOneEnabled?0:1;
    } else if (line.contains("conditionTwo")){
        status = hasConditionTwoEnabled?0:1;
    } else{
        status = -1;
    }

    return status;
}


// test it base on different status value..
switch (status) {
case 0: ...;
case 1: ...;
default: ...;
}

但是,如果你的if-else模式在经过一些修改后可以连续重复,你可以为它创建不同的布尔函数。

答案 2 :(得分:0)

首先,ab 永远不会为假,因此您的上一个else声明是多余的。

您的整套条件语句可以缩减为if - else if - else块。您不需要变量ab ,因为您无论如何都要使用它们来做其他事情。除了模糊变量之外,ab之类的名称会妨碍可读性。

让我先向您展示代码,然后我会引导您完成。

boolean lineContainsCond1 = line.contains("conditionOne");
boolean lineContainsCond2 = line.contains("conditionTwo");

boolean lineContainsNeitherCondition = !lineContainsCond1  && !lineContainsCond2;       

boolean conditionsForSomething3 = (lineContainsCond1 && conditionOneEnabled) || (lineContainsCond2 && conditionTwoEnabled);

if(lineContainsNeitherCondition)
    //do something 1 (Note: this is the same something 1 from your code)
else if(conditionsForSomething3)
    //do something 3
else
    //do something 2
您的代码中{p> lineContainsNeitherCondition基本上ab都是true

conditionsForSomething3a!b相同。

如果 lineContainsNeitherConditionconditionsForSomething3都是false ,我们可以得出以下结论:

  • 鉴于lineContainsNeitherConditionfalselineContainsCond1truelineContainsCond2true
  • 案例1:lineContainsCond1true: 在这种情况下,conditionOneIsEnabledtrueconditionOneEnabledfalse。如果是true,那么conditionFOrSomething3不能是false,如果它是false,则会导致lineContainsCond && !conditionOneEnabledtrue }导致原始代码中的b!a,从而执行//something 2

案例2可以提出类似的论点:lineContainsCond2true

答案 3 :(得分:-1)

为什么不减少代码中if else语句的数量。

尝试使用返回布尔值的私有方法替换if else语句。尝试将以下方法或类似方法配合到上面的代码中。

看看mookito非常适合嘲笑和抄袭。如果你有一个包含大量对象的大型项目,那么你可以节省数小时的时间。

private boolean doesLineContainCondition(String line, String  searchPhrase) {
 if(line.contains(searchPhrase) {
  return true;
 } else {
  return false;
 }
}


private boolean hasConditionBeenEnabled(boolean condition) {
 if(condition) { 
   a = true;
  }
 else {
  b= true;
 }
}