Я довольно плохо знаком с Java и следую Общим Учебным руководствам Новичка Eclipse. Они все очень полезны, но на Уроке 12, он использует assertTrue
для одного тестового сценария и assertFalse
для другого. Вот код:
// Check the book out to p1 (Thomas)
// Check to see that the book was successfully checked out to p1 (Thomas)
assertTrue("Book did not check out correctly", ml.checkOut(b1, p1)); // If checkOut fails, display message
assertEquals("Thomas", b1.getPerson().getName());
assertFalse("Book was already checked out", ml.checkOut(b1,p2)); // If checkOut fails, display message
assertEquals("Book was already checked out", m1.checkOut(b1,p2));
Я искал хорошую документацию относительно этих методов, но ничего не нашел. Если мое понимание корректно, assertTrue
а также assertFalse
отобразите строку, когда второй параметр оценит ко лжи. Если так, какой смысл того, чтобы иметь их обоих?
Править: Я думаю, что вижу то, что смущало меня. Автор, возможно, вставил их обоих только для проявления их функциональности (это - учебное руководство, в конце концов). И он настроил тот, который перестанет работать, так, чтобы сообщение распечатало бы и сказало бы мне, ПОЧЕМУ это перестало работать. Запуск иметь больше смысла... Я думаю, что это - объяснение, но я не уверен.
assertTrue
завершится ошибкой, если второй параметр оценивается как false
(другими словами, это гарантирует, что значение истинно). assertFalse
делает обратное.
assertTrue("This will succeed.", true);
assertTrue("This will fail!", false);
assertFalse("This will succeed.", false);
assertFalse("This will fail!", true);
Как и со многими другими вещами, лучший способ познакомиться с этими методами - просто поэкспериментировать :-).
Ваше понимание неверно, в подобных случаях всегда обращайтесь к JavaDoc.
assertFalse
public static void assertFalse(java.lang.String message, boolean condition)
Утверждает, что условие ложно. Если это не так, то выбрасывается AssertionError с заданным сообщением.
Параметры:
message
- идентифицирующее сообщение для AssertionError (null в порядке)condition
- проверяемое условие
Я думаю, это просто для вашего удобства (и удобства читателей вашего кода)
Ваш код и ваши модульные тесты должны быть в идеале самодокументирующимися, чему способствует этот API,
Подумайте, что более понятно для чтения:
AssertTrue(!(a > 3));
или
AssertFalse(a > 3);
Когда вы открываете свои тесты через xx месяцев, когда ваши тесты внезапно отказывают, вам потребуется гораздо меньше времени, чтобы понять, что пошло не так во втором случае (мое мнение). Если вы не согласны, вы всегда можете придерживаться AssertTrue для всех случаев :)
assertTrue
потерпит неудачу, если проверяемое значение ложно, а assertFalse
сделает наоборот: потерпит неудачу, если проверяемое значение истинно.
И еще одно: ваш последний assertEquals, скорее всего, не сработает, поскольку он будет сравнивать строку "Книга уже была выписана" с результатом m1.checkOut(b1,p2). Ему нужен третий параметр (второе значение для проверки на равенство).
Дело в семантике. В assertTrue вы утверждаете, что выражение истинно. Если это не так, то будет выведено сообщение, и утверждение будет неудачным. В assertFalse вы утверждаете, что выражение оценивается как false. Если это не так, то выводится сообщение и утверждение не выполняется.
assertTrue (message, value == false) == assertFalse (message, value);
Функционально они одинаковы, но если вы ожидаете, что значение будет false, то используйте assertFalse
. Если вы ожидаете, что значение будет true, то используйте assertTrue
.
Мне очень интересна ваша первая реакция на эти методы. Я буду использовать это в будущих аргументах, что assertTrue и assertFalse не самые удобные инструменты. Если вы используете
assertThat(thisOrThat, is(false));
, он будет намного более читаемым, и он также лучше выводит сообщение об ошибке.