2015-06-09 42 views
0

我在寫一些java代碼來檢查if-else的多個條件。代碼工作正常,但很難做單元測試。簡化單元測試的多個if-else語句

讀取包含關鍵字conditionOne,conditionTwo或其他關鍵字的行。 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 
} 
+2

過於複雜的條件語句是[反模式](http://c2.com/cgi/wiki?ArrowAntiPattern)。另請參閱[重構它的這個問題](http://stackoverflow.com/questions/105602/need-refactoring-ideas-for-arrow-anti-pattern)。 – azurefrog

+1

用a和b創建一個類,並將條件體作爲單獨的方法提取。 – assylias

回答

2

在if-else語句集之後,a和b不能同時爲假。 在前兩個if的變量a中將具有與相應的hasConditionXXEnabled相同的值,而b將被設置爲相反的值。其他的默認值都會設置爲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 
} 
+0

好的工作。下一步就是給'a'和'b'賦予有意義的名稱,或者用enum替換這些標誌,這些標誌賦予這些標誌組合的有意義的名稱。 – harshtuna

-1

爲什麼不減少if語句在你的代碼中的數量。

嘗試使用返回布爾值的私有方法替換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; 
} 
} 
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模式可以做一些修改後不斷重複,你可能只是爲它創建不同的布爾功能可按。

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 

lineContainsNeitherCondition基本上是在你的代碼都abtrue

conditionsForSomething3相等於a!b

如果lineContainsNeitherConditionconditionsForSomething3false,我們可以得出以下結論:

  • 鑑於lineContainsNeitherConditionfalse,要麼lineContainsCond1truelineContainsCond2true
  • 案例1:lineContainsCond1true: 在這種情況下,要麼conditionOneIsEnabledtrueconditionOneEnabledfalse。如果是true,然後conditionFOrSomething3不能false,如果它是false,然後導致lineContainsCond && !conditionOneEnabledtrue導致b!a原代碼,從而執行//something 2

可以對案例2進行類似的說法:lineContainsCond2true