Перейти к основному содержимому

Использование условий с утверждениями AssertJ

· 4 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим библиотеку AssertJ , особенно определение и использование условий для создания удобочитаемых и поддерживаемых тестов.

Основы AssertJ можно найти здесь .

2. Тестируемый класс

Давайте посмотрим на целевой класс, для которого мы будем писать тестовые примеры:

public class Member {
private String name;
private int age;

// constructors and getters
}

3. Создание условий

Мы можем определить условие утверждения, просто создав экземпляр класса Condition с соответствующими аргументами.

Самый удобный способ создать условие — использовать конструктор, который принимает предикат в качестве параметра . Другие конструкторы требуют от нас создания подкласса и переопределения метода match , что менее удобно.

При создании объекта Condition мы должны указать аргумент типа, который является типом значения, относительно которого оценивается условие.

Давайте объявим условие для поля age нашего класса Member :

Condition<Member> senior = new Condition<>(
m -> m.getAge() >= 60, "senior");

Старшая переменная теперь ссылается на экземпляр Condition , который проверяет, является ли Person старшим на основании его возраста . ``

Второй аргумент конструктора, String «senior» , представляет собой краткое описание, которое будет использоваться самим AssertJ для создания удобного для пользователя сообщения об ошибке, если условие не выполняется.

Еще одно условие, проверяющее, есть ли у Персоны имя « Джон», выглядит так:

Condition<Member> nameJohn = new Condition<>(
m -> m.getName().equalsIgnoreCase("John"),
"name John"
);

4. Тестовые случаи

Теперь давайте посмотрим, как использовать объекты Condition в нашем тестовом классе. Предположим, что условия Senior и nameJohn доступны как поля в нашем тестовом классе. ``

4.1. Утверждение скалярных значений

Следующий тест должен быть пройден, поскольку значение возраста выше порога трудового стажа:

Member member = new Member("John", 65);
assertThat(member).is(senior);

Поскольку утверждение с методом is проходит, утверждение с использованием isNot с тем же аргументом не будет выполнено:

// assertion fails with an error message containing "not to be <senior>"
assertThat(member).isNot(senior);

Используя переменную nameJohn , мы можем написать два похожих теста:

Member member = new Member("Jane", 60);
assertThat(member).doesNotHave(nameJohn);

// assertion fails with an error message containing "to have:\n <name John>"
assertThat(member).has(nameJohn);

Методы is и has , а также методы isNot и DoesNotHave имеют одинаковую семантику . Что мы используем, это просто вопрос выбора. Тем не менее, рекомендуется выбрать тот, который сделает наш тестовый код более читабельным.

4.2. Утверждение коллекций

Условия работают не только со скалярными значениями, но также могут проверять существование или отсутствие элементов в коллекции. Давайте посмотрим на тестовый пример:

List<Member> members = new ArrayList<>();
members.add(new Member("Alice", 50));
members.add(new Member("Bob", 60));

assertThat(members).haveExactly(1, senior);
assertThat(members).doNotHave(nameJohn);

Метод haveExactly устанавливает точное количество элементов, удовлетворяющих заданному условию , а метод doNotHave проверяет отсутствие элементов.

С условиями сбора работают не только методы haveExactly и doNotHave . Полный список этих методов см. в описании класса AbstractIterableAssert в документации по API.

4.3. Условия объединения

Мы можем комбинировать различные условия, используя три статических метода класса Assertions :

  • not — создает условие, которое выполняется, если заданное условие не выполняется
  • allOf — создает условие, которое выполняется только при соблюдении всех указанных условий.
  • anyOf — создает условие, которое выполняется, если выполняется хотя бы одно из указанных условий

Вот как можно использовать методы not и allOf для объединения условий:

Member john = new Member("John", 60);
Member jane = new Member("Jane", 50);

assertThat(john).is(allOf(senior, nameJohn));
assertThat(jane).is(allOf(not(nameJohn), not(senior)));

Точно так же мы можем использовать anyOf :

Member john = new Member("John", 50);
Member jane = new Member("Jane", 60);

assertThat(john).is(anyOf(senior, nameJohn));
assertThat(jane).is(anyOf(nameJohn, senior));

5. Вывод

Этот учебник дал руководство по условиям AssertJ и тому, как их использовать для создания очень читаемых утверждений в вашем тестовом коде.

Реализацию всех примеров и фрагментов кода можно найти на GitHub .