Účelem unit testu je co nejdříve identifikovat chyby v aplikaci. Ačkoli vás ke stejnému cíli může vést několik kanálů, měli byste se snažit použít nejúčinnější cestu.
Testovací sada JUnit může mít několik testovacích tříd, které potřebují stejná data, ale nemůžete znovu použít testovací data. V předchozích verzích JUnit bylo dobrým přístupem vytvořit obslužnou metodu a poté tuto metodu zavolat pokaždé, když testovací třída potřebuje svá data.
JUnit 5 poskytuje efektivnější přístup k tomuto problému: dependency injection (DI).
Co je závislostní injekce?
DI je návrhový vzor, kde objekt poskytuje závislosti jiného objektu. Když vytváříte aplikaci Java, můžete mít třídu, která závisí na objektu, který jiná třída vytváří, aby vykonávala svou funkci.
Před injekcí závislostí, abyste mohli použít objekt z jiné třídy, museli byste vytvořit novou instanci tohoto objektu v rámci třídy, která na něm závisí. Pokud byste tedy měli několik tříd závislých na stejném objektu, museli byste vytvořit několik jeho instancí v rámci závislých tříd.
DI vám umožňuje používat objekt v závislé třídě, aniž byste v této třídě vytvořili jeho novou instanci.
Dependency Injection v JUnit 5
JUnit 5 vám umožňuje vložit závislosti jak do testovacích metod, tak do konstruktorů. To je důležité, protože předchozí verze rámce neumožňovaly testovacím metodám nebo konstruktérům mít parametry.
JUnit 5 vám umožňuje vložit tolik parametrů, kolik chcete. Jediný háček je v tom, že ParameterResolver API musí být schopno vyřešit každý parametr za běhu. JUnit má v současnosti tři vestavěné překladače parametrů, které automaticky používá. Chcete-li použít jakýkoli jiný resolver, musíte jej explicitně zaregistrovat pomocí anotace @ExtendWith.
Injekce závislostí v JUnit
Tento ukázkový program používá jeden z vestavěných parametrů JUnit (TestInfoParameterResolver), aby ukázal, jak můžete vložit závislost do Test JUnit 5. TestInfoParameterResolver řeší objekty, které patří do rozhraní TestInfo. JUnit 5 tedy poskytne instanci rozhraní TestInfo jakékoli metodě nebo konstruktoru, který jej používá.
importstatický org.junit.jupiter.api. Tvrzení.*;
import org.junit.jupiter.api. DisplayName;
import org.junit.jupiter.api. Test;
import org.junit.jupiter.api. TestInfo;třídaInfoTestInterfaceTest{
// Vložení objektu testInfo do konstruktoru InfoTestInterfaceTest
InfoTestInterfaceTest (TestInfo testInfo) {
serveEquals("InfoTestInterfaceTest", testInfo.getDisplayName());
}// Vložení objektu testInfo do metod
@Test
prázdnotatestMethodName(TestInfo testInfo){
serveEquals("název_testovací metody (TestInfo)", testInfo.getDisplayName());
}
@Test
@Zobrazované jméno("metoda využívající @Zobrazované jméno anotace")
prázdnotatestMethodNameTwo(TestInfo testInfo){
serveEquals("metoda používající @Zobrazované jméno anotace", testInfo.getDisplayName());
}
}
Výše uvedený test JUnit ukazuje, jak vložit objekt do konstruktoru a dvě metody. The JUnit TestInfo rozhraní má čtyři metody, které můžete použít s jeho objektem.
Nejužitečnější je metoda getDisplayName(). Vrací zobrazovaný název aktuální testovací metody nebo konstruktoru. Ve výchozím nastavení je tento název založen na třídě. Ale pokud použijete anotaci @DisplayName, metoda getDisplayName() místo toho vrátí tento text.
Výše uvedená třída testu generuje následující zprávu o testu:
Použijte DI v metodách @Před a @Po
Existují čtyři další typy anotovaných metod JUnit, které podporují závislosti. Jedná se o anotace @BeforeAll, @BeforeEach, @AfterAll a @AfterEach. Stejně jako u metody @Test vše, co musíte udělat, je předat objekt jakékoli z metod před nebo po jako parametr a můžete začít.
Anotace @Before a @After jsou důležité, protože vám také pomohou vyvinout efektivnější testovací kód. Možnost vkládat do těchto metod také závislosti dále zlepší váš testovací kód.