Тестовый пример не покрывает ветку

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

age = calculateAge();

if (age <= 30 || (age > 30 && city="newyork")){
println("Welcome")
}

У меня есть тестовые примеры, написанные на Spock со всеми возможными значениями возраста и города

25|Newyork
25|London
30|Newyork
30|London
35|Newyork
35|London

Но все равно одна ветка отсутствует. Он будет покрыт, если я изменю возраст <= 30 на возраст <30 лет.

Какие-нибудь мысли?

city="newyork" - это задание
cfrick 10.08.2018 17:49
0
1
46
1

Ответы 1

Это связано с тем, что проверка age > 30 является избыточной - нет ситуации, когда она когда-либо будет выполнена в этом сценарии и вернет false. Если выполнение доходит до этой точки, условие вернет истину, так как оно выполнит это только в том случае, если age <= 30 ложно. Это происходит потому, что || является оператором «короткого замыкания», что означает (для «||»), что он выполняет только правую часть, если левая часть ложна (как если бы левая часть истинна, результат Операция «или» верна независимо от результата в правой части.

То же самое (в инвертированном смысле) верно для оператора &&, за исключением того, что в этом случае он выполняет только правую часть, если левая часть истинна, как если бы это была левая часть, если ложь, результат && также должен быть ложным, независимо от результата правой части.

Вы можете заменить эту проверку на:

if (age <= 30 || city == "newyork") {
   println("Welcome")
}

и у вас будет такая же функциональность, и все ветки будут охвачены.

Спасибо за быстрый ответ и подробное объяснение. Это имеет смысл. Позвольте мне внести изменения и протестировать их.

Sam 10.08.2018 18:31

Другие вопросы по теме