Java: Автоматическое тестирование
2026-02-26 18:53 Diff

Встроенный в Java механизм проверки утверждений assert обладает рядом недостатков:

  1. Вы не можете быть уверены что он сработает в любой ситуации. Если запустить программу без аргумента -enableassertions (-ea), то проверки будут игнорироваться. Поэтому полагаться на assert в полной мере нельзя.
  2. Сами проверки сильно ограничены. После ключевого слова assert может быть только либо true, либо false, а это значит что вам необходимо сначала самостоятельно подготовить данные к проверке.
  3. Результат проверки неинформативен. Вам вернётся только сообщение об ошибке с указанием номера строки и имени класса в котором произошла ошибка. Да, есть вариант передать текстовое сообщение вместе с ошибкой, но так не делают, потому что это слишком "ручной" способ, требующий больших усилий.

В результате всё это привело к тому, что ключевым словом assert практически не пользуются. Более того, далеко не все Java-программисты смогут быстро ответить почему они иногда срабатывают, а иногда нет. Однако, это был отличный переход от использования if для проверки утверждения и ручного пробрасывания ошибок, к более чистому и понятному коду.

Сегодня мы рассмотрим библиотеку AssertJ, которая позволяет гораздо проще и удобнее писать тесты, а также получать достаточно информативный вывод об ошибках. При этом внутри будет всё равно лежать тот же самый механизм, который мы рассматривали в предыдущих уроках.

AssertJ не входит в перечень стандартных библиотек, но её можно подключить к вашему проекту как любую другую стороннюю библиотеку:

Точкой входа будет являться метод assertThat(), его можно импортировать вот так:

Написание тестов с использованием библиотеки AssertJ отличается от использования ключевого слова assert и базируется на цепочке методов. Такой подход называется fluent API. Давайте рассмотрим пример теста, написанного с использованием этой библиотеки:

Теперь тест превращается в связный текст на английском языке. Его можно прочитать следующим образом: Assert that a is equal to b, что дословно можно перевести как "Утверждаем, что a равно b". В случае если утверждение окажется ложным, то будет выброшено AssertionFailedError из библиотеки org.opentest4j.AssertionFailedError. Вывод тестов также будет сформулирован как связный текст на английском языке. Например, если в предыдущем примере мы возьмём String b = "Hello, world", то получим следующее сообщение об ошибке:

В первой строке мы видим сообщение о проброшенной ошибке, а далее текст, который можно перевести как: "Ожидали, что Hello, world! будет равен "Hello, world", но это оказалось не так". Ниже отдельно вынесены ещё раз "ожидание/реальность". Такой вывод об ошибках читать уже гораздо приятнее, он является куда более информативным.