AssertJ: читабельні перевірки та м’які твердження
AssertJ — бібліотека плавних (fluent) перевірок. Усе починається з assertThat(actual), далі ланцюжок методів, які підказує IDE:
import static org.assertj.core.api.Assertions.assertThat;
assertThat(user.name()).isEqualTo("Anna");
assertThat(names).hasSize(3).contains("Anna").doesNotHaveDuplicates();
assertThat(price).isBetween(10, 100);
assertThat(order).usingRecursiveComparison().isEqualTo(expectedOrder);
Перевагою над простим assertEquals є зрозуміле повідомлення про помилку («Expecting … to contain …») і порядок «фактичне, потім очікуване» без плутанини з аргументами. usingRecursiveComparison() порівнює об’єкти поле за полем без перевизначеного equals, extracting витягує поля зі списку об’єктів. Для винятків — assertThatThrownBy(() -> ...).isInstanceOf(X.class).hasMessageContaining("...").
М’які твердження (soft assertions) не зупиняються на першій помилці, а збирають усі й показують разом. Корисно, коли перевіряється кілька незалежних полів і хочеться побачити всю картину за один прогін:
SoftAssertions.assertSoftly(softly -> {
softly.assertThat(user.name()).isEqualTo("Anna");
softly.assertThat(user.role()).isEqualTo("admin");
softly.assertThat(user.active()).isTrue();
});
У assertSoftly перевірка запускається автоматично наприкінці блоку. Якщо створити new SoftAssertions() вручну, треба викликати softly.assertAll(): без нього збої ігноруються й тест «зеленіє». У JUnit 5 можна підключити SoftAssertionsExtension із полем @InjectSoftAssertions.
Коли не варто: коли наступна перевірка залежить від попередньої (немає сенсу перевіряти поле, якщо об’єкт null): там потрібна звичайна, жорстка.
JUnit 5 і TestNG мають власні Assertions, а Hamcrest — assertThat(actual, is(expected)) (його матчери використовує REST Assured). Для нового коду AssertJ зручніший.