Java / JUnit - AssertTrue по сравнению с AssertFalse

Я довольно плохо знаком с 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 отобразите строку, когда второй параметр оценит ко лжи. Если так, какой смысл того, чтобы иметь их обоих?

Править: Я думаю, что вижу то, что смущало меня. Автор, возможно, вставил их обоих только для проявления их функциональности (это - учебное руководство, в конце концов). И он настроил тот, который перестанет работать, так, чтобы сообщение распечатало бы и сказало бы мне, ПОЧЕМУ это перестало работать. Запуск иметь больше смысла... Я думаю, что это - объяснение, но я не уверен.

50
задан Thomas 15 April 2015 в 10:18
поделиться

6 ответов

assertTrue завершится ошибкой, если второй параметр оценивается как false (другими словами, это гарантирует, что значение истинно). assertFalse делает обратное.

assertTrue("This will succeed.", true);
assertTrue("This will fail!", false);

assertFalse("This will succeed.", false);
assertFalse("This will fail!", true);

Как и со многими другими вещами, лучший способ познакомиться с этими методами - просто поэкспериментировать :-).

107
ответ дан 7 November 2019 в 10:30
поделиться

Ваше понимание неверно, в подобных случаях всегда обращайтесь к JavaDoc.

assertFalse

public static void assertFalse(java.lang.String message,
 boolean condition)

Утверждает, что условие ложно. Если это не так, то выбрасывается AssertionError с заданным сообщением.

Параметры:

  • message - идентифицирующее сообщение для AssertionError (null в порядке)
  • condition - проверяемое условие
29
ответ дан 7 November 2019 в 10:30
поделиться

Я думаю, это просто для вашего удобства (и удобства читателей вашего кода)

Ваш код и ваши модульные тесты должны быть в идеале самодокументирующимися, чему способствует этот API,

Подумайте, что более понятно для чтения:

AssertTrue(!(a > 3));

или

AssertFalse(a > 3);

Когда вы открываете свои тесты через xx месяцев, когда ваши тесты внезапно отказывают, вам потребуется гораздо меньше времени, чтобы понять, что пошло не так во втором случае (мое мнение). Если вы не согласны, вы всегда можете придерживаться AssertTrue для всех случаев :)

9
ответ дан 7 November 2019 в 10:30
поделиться

assertTrue потерпит неудачу, если проверяемое значение ложно, а assertFalse сделает наоборот: потерпит неудачу, если проверяемое значение истинно.

И еще одно: ваш последний assertEquals, скорее всего, не сработает, поскольку он будет сравнивать строку "Книга уже была выписана" с результатом m1.checkOut(b1,p2). Ему нужен третий параметр (второе значение для проверки на равенство).

2
ответ дан 7 November 2019 в 10:30
поделиться

Дело в семантике. В assertTrue вы утверждаете, что выражение истинно. Если это не так, то будет выведено сообщение, и утверждение будет неудачным. В assertFalse вы утверждаете, что выражение оценивается как false. Если это не так, то выводится сообщение и утверждение не выполняется.

assertTrue (message, value == false) == assertFalse (message, value);

Функционально они одинаковы, но если вы ожидаете, что значение будет false, то используйте assertFalse. Если вы ожидаете, что значение будет true, то используйте assertTrue.

10
ответ дан 7 November 2019 в 10:30
поделиться

Мне очень интересна ваша первая реакция на эти методы. Я буду использовать это в будущих аргументах, что assertTrue и assertFalse не самые удобные инструменты. Если вы используете

assertThat(thisOrThat, is(false));

, он будет намного более читаемым, и он также лучше выводит сообщение об ошибке.

7
ответ дан 7 November 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: