2015-06-09 2 views
0

Я пишу код java для проверки нескольких условий на if-else. Код работает правильно, но выполнить блок-тест сложно.Упростите несколько инструкций if-else для модульного тестирования

читает строки, которые содержат ключевое слово conditionOne, conditionTwo или другими ключевыми словами. hasConditionOneEnabled и hasConditionTwoEnabled являются булевыми значениями.

В моем реальном коде есть более 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

a и b не могут быть ложными после множества операторов if-else. В первых двух переменных if будет иметь то же значение, что и соответствующее 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 
} 
+0

хорошая работа. следующим шагом было бы дать значащие имена 'a' и' b' или заменить эти флаги на перечисление, которое дает значащее имя комбинациям этих флагов. – harshtuna

-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; 
} 
} 
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: ...; 
} 

Однако, если если-иначе модель может непрерывно повторяться после некоторой модификации, вы можете просто создать другое логическое Funciton для него.

0

Прежде всего, как a и bникогда не может быть ложным, поэтому ваш последний else заявление является излишним.

Весь комплекс условных операторов можно свести к блоку if - else if - else. Вам не нужны переменные a и b, так как вы используете их, чтобы что-то делать в любом случае. Помимо неопределенных переменных имена, такие как a и b, затрудняют читаемость.

Позвольте мне сначала показать вам код, и я проведу вас через него в дальнейшем.

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, по существу, как a и b быть true в вашем коде.

conditionsForSomething3 tantamounts to a!b.

Если как lineContainsNeitherCondition и conditionsForSomething3 являются false, можно получить следующие выводы:

  • Учитывая lineContainsNeitherCondition является false, либо lineContainsCond1 является true или lineContainsCond2 является true
  • Случай 1: lineContainsCond1 является true: В этом случае conditionOneIsEnabled: true или conditionOneEnabled - false. Если бы это было true, то conditionFOrSomething3 не может быть false, если это false, то это приводит к lineContainsCond && !conditionOneEnabled быть true, что приводит к b!a в исходном коде и, таким образом, выполняет //something 2.

Аналогичный аргумент может быть сделан для случая 2: lineContainsCond2 - true.

Смежные вопросы