Как создавать инъекции зависимостей в JUnit
Программирование

Как создавать инъекции зависимостей в JUnit

Очистите свои тестовые примеры с помощью автоматической инъекции зависимостей, любезно предоставленной JUnit

Цель модульного тестирования – как можно быстрее выявить ошибки в приложении. Хотя несколько каналов могут привести вас к одной и той же цели, вы должны стремиться использовать наиболее эффективный маршрут

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

JUnit 5 предлагает более эффективный подход к решению этой проблемы: внедрение зависимостей (DI)

Что такое инъекция зависимостей?

DI – это шаблон проектирования, в котором объект обеспечивает зависимость от другого объекта. Когда вы создаете Java-приложение, у вас может быть класс, который зависит от объекта, созданного другим классом для выполнения своей функции

До появления инъекции зависимостей, чтобы использовать объект из другого класса, вам пришлось бы создать новый экземпляр этого объекта в классе, который от него зависит. Таким образом, если у вас было несколько классов, зависящих от одного и того же объекта, вам пришлось бы создать несколько его экземпляров в зависимых классах

DI позволяет использовать объект в зависимом классе, не создавая его новый экземпляр в этом классе

Инъекция зависимостей в JUnit 5

JUnit 5 позволяет внедрять зависимости как в тестовые методы, так и в конструкторы. Это важно, поскольку предыдущие версии фреймворка не позволяли тестовым методам и конструкторам иметь параметры

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

Инжектирование зависимостей в JUnit

Этот пример программы использует один из встроенных параметров JUnit (TestInfoParameterResolver), чтобы продемонстрировать, как можно внедрить зависимость в тест JUnit 5.TestInfoParameterResolver разрешает объекты, принадлежащие интерфейсу TestInfo. Таким образом, JUnit 5 предоставит экземпляр интерфейса TestInfo любому методу или конструктору, который его использует

importstaticorg.junit.jupiter.api.Assertions.*;
importorg.junit.jupiter.api.DisplayName;
importorg.junit.jupiter.api.Test;
importorg.junit.jupiter.api.TestInfo;
 
classInfoTestInterfaceTest
    // Injecting a testInfo object into the InfoTestInterfaceTest constructor
    InfoTestInterfaceTest(TestInfo testInfo) {
        assertEquals('InfoTestInterfaceTest', testInfo.getDisplayName());
    }
 
    // Injecting a testInfo object into methods
    @Test
    voidtestMethodName(TestInfo testInfo)
        assertEquals('testMethodName(TestInfo)', testInfo.getDisplayName());
    }
 
    @Test
    @DisplayName'method using the @DisplayName annotation'
    voidtestMethodNameTwo(TestInfo testInfo)
        assertEquals('method using the @DisplayName annotation', testInfo.getDisplayName());
    }.

Приведенный выше тест JUnit демонстрирует, как внедрить объект в конструктор и два метода. Интерфейс JUnit TestInfo имеет четыре метода, которые можно использовать с его объектом

Метод getDisplayName() является наиболее полезным. Он возвращает отображаемое имя текущего метода или конструктора теста. По умолчанию это имя основано на классе. Но если вы используете аннотацию @DisplayName, метод getDisplayName() вернет вместо нее этот текст

Приведенный выше тестовый класс генерирует следующий тестовый отчет:

Используйте DI в методах @Before и @After

Существует еще четыре типа аннотированных методов JUnit, которые поддерживают зависимости. Это аннотации @BeforeAll, @BeforeEach, @AfterAll и @AfterEach. Как и в методе @Test, все, что вам нужно сделать, это передать объект любому из методов before или after в качестве параметра, и все готово

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

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий