Встроенный в Java механизм проверки утверждений assert
обладает рядом недостатков:
- Вы не можете быть уверены что он сработает в любой ситуации. Если запустить программу без аргумента
-enableassertions
(-ea
), то проверки будут игнорироваться. Поэтому полагаться наassert
в полной мере нельзя. - Сами проверки сильно ограничены. После ключевого слова
assert
может быть только либоtrue
, либоfalse
, а это значит что вам необходимо сначала самостоятельно подготовить данные к проверке. - Результат проверки неинформативен. Вам вернётся только сообщение об ошибке с указанием номера строки и имени класса в котором произошла ошибка. Да, есть вариант передать текстовое сообщение вместе с ошибкой, но так не делают, потому что это слишком "ручной" способ, требующий больших усилий.
В результате всё это привело к тому, что ключевым словом assert
практически не пользуются. Более того, далеко не все Java-программисты смогут быстро ответить почему они иногда срабатывают, а иногда нет. Однако, это был отличный переход от использования if для проверки утверждения и ручного пробрасывания ошибок, к более чистому и понятному коду.
Сегодня мы рассмотрим библиотеку AssertJ, которая позволяет гораздо проще и удобнее писать тесты, а также получать достаточно информативный вывод об ошибках. При этом внутри будет всё равно лежать тот же самый механизм, который мы рассматривали в предыдущих уроках.
AssertJ не входит в перечень стандартных библиотек, но её можно подключить к вашему проекту как любую другую стороннюю библиотеку:
dependencies {
// Такая зависимость используется только для тестирования
testImplementation("org.assertj:assertj-core:3.22.0")
}
Точкой входа будет являться метод assertThat()
, его можно импортировать вот так:
import static org.assertj.core.api.Assertions.assertThat;
Написание тестов с использованием библиотеки AssertJ отличается от использования ключевого слова assert
и базируется на цепочке методов. Такой подход называется fluent API. Давайте рассмотрим пример теста, написанного с использованием этой библиотеки:
import static org.assertj.core.api.Assertions.assertThat;
class SomeClassTest {
public static void testMethod() {
var a = "Hello, world!";
var b = "Hello, world!";
assertThat(a).isEqualTo(b);
}
}
Теперь тест превращается в связный текст на английском языке. Его можно прочитать следующим образом: Assert that a is equal to b, что дословно можно перевести как "Утверждаем, что a равно b". В случае если утверждение окажется ложным, то будет выброшено AssertionFailedError
из библиотеки org.opentest4j.AssertionFailedError
. Вывод тестов также будет сформулирован как связный текст на английском языке. Например, если в предыдущем примере мы возьмём String b = "Hello, world"
, то получим следующее сообщение об ошибке:
org.opentest4j.AssertionFailedError:
Expecting:
<"Hello, world!">
to be equal to:
<"Hello, world">
but was not.
Expected :Hello, world
Actual :Hello, world!
В первой строке мы видим сообщение о проброшенной ошибке, а далее текст, который можно перевести как: "Ожидали, что Hello, world! будет равен "Hello, world", но это оказалось не так". Ниже отдельно вынесены ещё раз "ожидание/реальность". Такой вывод об ошибках читать уже гораздо приятнее, он является куда более информативным.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.