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

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

 

1. обзор

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

Основы AssertJ можно найти вhere.

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

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

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

    // constructors and getters
}

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

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

The most convenient way to create a Condition is to use the constructor that takes a Predicate as a parameter. Другие конструкторы требуют, чтобы мы создали подкласс и переопределили методmatches, что менее удобно.

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

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

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

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

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

Другое условие, проверка наличияPersonname «Джон», выглядит так:

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

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

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

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

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

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

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

// assertion fails with an error message containing "not to be "
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 "
assertThat(member).has(nameJohn);

The is and has methods, as well as the isNot and doesNotHave methods have the same semantics. Что мы используем, это просто вопрос выбора. Тем не менее, рекомендуется выбрать тот, который делает наш тестовый код более читабельным.

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

Условия не работают только со скалярными значениями,but they can also verify the existence or non-existence of elements in a collection. Давайте взглянем на тестовый пример:

List 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 утверждает точное количество элементов, соответствующих заданномуCondition, а методdoNotHave проверяет отсутствие элементов.

МетодыhaveExactly иdoNotHave - не единственные, которые работают с условиями сбора. Полный список этих методов см. Вthe AbstractIterableAssert class в документации 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 и их использованию для создания очень удобочитаемых утверждений в тестовом коде.

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