Целта на единичния тест е да идентифицира грешките в приложението възможно най-скоро. Въпреки че няколко канала може да ви отведат до една и съща цел, трябва да се стремите да използвате най-ефективния маршрут.
Тестов пакет 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 на всеки метод или конструктор, който го използва.
импортиранестатичен org.junit.jupiter.api. Твърдения.*;
импортиране org.junit.jupiter.api. DisplayName;
импортиране org.junit.jupiter.api. Тест;
импортиране org.junit.jupiter.api. TestInfo;класInfoTestInterfaceTest{
// Инжектиране на обект testInfo в конструктора InfoTestInterfaceTest
InfoTestInterfaceTest (TestInfo testInfo) {
assertEquals("InfoTestInterfaceTest", testInfo.getDisplayName());
}// Инжектиране на testInfo обект в методи
@Тест
невалиденtestMethodName(TestInfo testInfo){
assertEquals("testMethodName (TestInfo)", testInfo.getDisplayName());
}
@Тест
@Показвано име("метод, използващ @Показвано име анотация")
невалиденtestMethodNameTwo(TestInfo testInfo){
assertEquals("метод, използващ @Показвано име анотация", testInfo.getDisplayName());
}
}
Тестът JUnit по-горе демонстрира как да инжектирате обект в конструктор и два метода. The JUnit TestInfo интерфейсът има четири метода, които можете да използвате с неговия обект.
Методът getDisplayName() е най-полезният. Той връща показваното име на текущия тестов метод или конструктор. По подразбиране това име е базирано на класа. Но ако използвате анотацията @DisplayName, методът getDisplayName() ще върне този текст вместо това.
Тестовият клас по-горе генерира следния тестов отчет:
Използвайте DI в методите @Before и @After
Има четири други вида анотирани методи на JUnit, които поддържат зависимости. Това са анотациите @BeforeAll, @BeforeEach, @AfterAll и @AfterEach. Подобно на метода @Test, всичко, което трябва да направите, е да предадете обект на някой от преди или след методите като параметър и сте готови.
Анотациите @Before и @After са важни, тъй като те също ви помагат да разработите по-ефективен тестов код. Наличието на възможност за инжектиране на зависимости в тези методи допълнително ще подобри вашия тестов код.