1. Обзор

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

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

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

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

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

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

    // constructors and getters
}

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

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

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

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

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

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

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

Еще одно условие, проверяющее, есть ли у Person имя John, выглядит так:

4. Тестовые примеры

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

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

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

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

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

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

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

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

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

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);

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

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

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

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. Полный список этих методов см. в описании класса AbstractIterableAssert в документации по API.

4.3. Комбинирование условий

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

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

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

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

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)));

5. Заключение

Member john = new Member("John", 50);
Member jane = new Member("Jane", 60);
        
assertThat(john).is(anyOf(senior, nameJohn));
assertThat(jane).is(anyOf(nameJohn, senior));

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

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

«