Внедрение зависимостей и тестирование в JUnit 5

21.07.2020 181
В этой статье рассматриваются новые возможности предоставления параметров для модульного тестирования в JUnit 5 с помощью внедрения зависимостей. Мы расскажем, как максимально эффективно проводить тестирование, как использовать различные распознаватели параметров, как писать повторяющиеся и параметризованные тесты.

1. Внедрение зависимостей в JUnit 5

Во всех предыдущих версиях JUnit не допускалось включение параметров в конструкторы или методы тестов. Одним из главных нововведений в JUnit 5 стала возможность использования параметров в конструкторах и методах тестов. Это обеспечивает большую гибкость и позволяет использовать внедрение зависимостей для конструкторов и методов.

ParameterResolver определяет API для расширений тестов, которым необходимо динамически распознавать параметры во время выполнения. Если конструктор классов, метод теста или метод жизненного цикла принимает параметр, этот параметр необходимо распознать во время выполнения с помощью зарегистрированного ParameterResolver. Можно внедрить любое необходимое число параметров в любом необходимом порядке.

В настоящее время существует три встроенных распознавателя, однако другие распознаватели параметров должны быть прямо задействованы посредством регистрации соответствующих расширений с помощью @ExtendWith. Автоматически регистрируются следующие распознаватели параметров:

  • TestInfoParameterResolver: Если параметр конструктора или метода имеет тип TestInfo, TestInfoParameterResolver предоставляет экземпляр TestInfo,соответствующий текущему контейнеру или тесту как значению параметра. TestInfo — это класс, объекты которого используются для внедрения информации о текущем выполняемом тесте или контейнере в методы @Test, @BeforeEach, @AfterEach, @BeforeAll и @AfterAll. TestInfo можно затем использовать для получения информации о текущем контейнере или тесте, такой как отображаемое имя, класс теста, метод теста и связанные с ними теги. Отображаемое имя — это либо техническое имя, например имя тестового класса или метода, либо произвольное имя, настраиваемое через @DisplayName. В Примере 1 (Listing 1) показано, как использовать параметр TestInfo в качества аргумента конструктора и аннотированных методов.
  • listing_1
    Затем аннотированный метод @BeforeEach выполняется перед каждым тестом. Он имеет внедренный параметр TestInfo и подтверждает, что отображаемое имя является ожидаемым, т.е. либо именем метода, либо именем, указанным аннотацией @DisplayName (2).

    Оба теста имеют внедренный параметр TestInfo. Каждый из них подтверждает, что отображаемое имя является ожидаемым, т.е. либо именем метода для первого теста (3), либо именем, указанным аннотацией @DisplayName для второго теста (4).

    Напомним, что встроенный TestInfoParameterResolver предоставляет экземпляр TestInfo соответствующий текущему контейнеру или тесту как значение для ожидаемых параметров конструктора и методов.

  • TestReporterParameterResolver. Если параметр конструктора или метода имеет тип TestReporter, то TestReporterParameterResolver предоставляет экземпляр TestReporterTestReporter — это функциональный интерфейс, и поэтому может использоваться как цель присваивания для лямбда-выражения или ссылки метода. Паратметры типа TestReporter можно внедрить в методы тестовых классов, аннотированных как @BeforeEach, @AfterEach и @Test. TestReporter можно использовать для публикации дополнительных данных о выполнении текущего теста. В Примере 2 (Listing 2) показано, как использовать параметр TestReporter в качества аргумента аннотированных методов @Test.
  • listing_2
    В этом примере параметр TestReporter внедряется в три метода.

    В первом методе он используется для публикации единственного вводимого значения (1).

    Во втором методе он используется для публикации пары ключ-значение (2).

    В третьем методе мы конструируем карту (3), затем вводим в нее две пары ключ-значение (4) и используем его для публикации сконструированный карты (5).

    Напомним, что встроенный TestReporterParameterResolver предоставляет экземпляр TestReporter, необходимый для публикаций записей. Результат выполнения этого теста показан ниже.

    test_result

  • RepetitionInfoParameterResolver. Если параметр метода в методе @RepeatedTest, @BeforeEach или @AfterEach имеет тип RepetitionInfo, то RepetitionInfoParameterResolver предоставляет экземпляр RepetitionInfo. В этом случае RepetitionInfo можно использовать для получения информации о текущем повторе и общем числе повторов для соответствующего @RepeatedTest. RepetitionInfoParameterResolver не регистрируется вне контекста @RepeatedTest. О повторяющихся тестах мы более подробно поговорим в следующем разделе и приведем соответствующие примеры.

Автор Catalin Tudose, Java and Web Technologies Expert

Продолжение статьи по ссылке

Расскажи друзьям:

 
Оценка и обучение ИТ-специалистов по ключевым направлениям разработки программного обеспечения. Курсы от экспертов-практиков по языкам программирования, системному и бизнес-анализу, управлению проектами, тестированию ПО, архитектуре ПО. Luxoft Training – единственный учебный центр в России, авторизованный IIBA. Действует скидка 10% на обучение физических лиц.
   Подпишись на ежемесячный DigestLT
Успешная форма подписки.
Пользователь только что записался на курс ""
Спасибо!
Форма отправлена успешно.