JUnit 5 Selvstudium:Skrivning af indlejrede tests
Dette blogindlæg beskriver, hvordan vi kan skrive indlejrede tests med JUnit 5. Når vi har afsluttet dette blogindlæg, har vi:
- Kan oprette indlejrede testklasser.
- Vid, hvordan vi kan tilføje opsætnings-, nedtagnings- og testmetoder til indlejrede testklasser.
- Forstå påkaldelsesrækkefølgen for opsætning, nedtagning og testmetoder.
Lad os starte med at tage et kig på vores testklasse.
Introduktion til vores testklasse
Den forrige del af denne tutorial beskrev, hvordan vi kan bruge opsætnings- og nedtagningsmetoder og tilføje testmetoder til vores testklasser. Vi skrev også en simpel testklasse og tilføjede alle opsætnings- og nedtagningsmetoder til den oprettede klasse.
Kildekoden til vores testklasse ser ud som følger:
import org.junit.jupiter.api.*; @DisplayName("JUnit 5 Nested Example") class JUnit5NestedExampleTest { @BeforeAll static void beforeAll() { System.out.println("Before all test methods"); } @BeforeEach void beforeEach() { System.out.println("Before each test method"); } @AfterEach void afterEach() { System.out.println("After each test method"); } @AfterAll static void afterAll() { System.out.println("After all test methods"); } }
Dernæst vil vi tilføje indlejrede opsætnings-, deardown- og testmetoder til vores testklasse.
Skrivning af indlejrede tests
Når vi skriver indlejrede test med JUnit 5, skal vi oprette et indlejret testklassehierarki, der indeholder vores opsætnings-, nedtagnings- og testmetoder. Når vi tilføjer indlejrede testklasser til vores testklasse, skal vi følge disse regler:
- Alle indlejrede testklasser skal være ikke-statiske indre klasser.
- Vi er nødt til at annotere vores indlejrede testklasser med
@Nested
anmærkning. Denne annotering sikrer, at JUnit 5 genkender vores indlejrede testklasser. - Der er ingen grænse for dybden af klassehierarkiet.
- Som standard kan en indlejret testklasse indeholde testmetoder, en
@BeforeEach
metode og en@AfterEach
metode. - Fordi Java ikke tillader
static
medlemmer i indre klasser,@BeforeAll
og@AfterAll
metoder fungerer ikke som standard.
Lad os tilføje et par indre klasser til vores testklasse. Ideen med denne øvelse er at demonstrere påkaldelsesrækkefølgen for opsætning, nedtagning og testmetoder. Vi kan tilføje de nødvendige indre klasser til vores testklasse ved at følge disse trin:
Først , skal vi tilføje en ny indre klasse kaldet A
til vores testklasse og anmærk den indre klasse med @Nested
anmærkning. Efter at vi har oprettet A
klasse, er vi nødt til at tilføje en opsætning, nedtagning og testmetode til den oprettede indre klasse.
Efter at vi har tilføjet denne indre klasse til JUnit5NestedExampleTest
klasse, ser kildekoden til vores testklasse således ud:
import org.junit.jupiter.api.*; @DisplayName("JUnit 5 Nested Example") class JUnit5NestedExampleTest { @BeforeAll static void beforeAll() { System.out.println("Before all test methods"); } @BeforeEach void beforeEach() { System.out.println("Before each test method"); } @AfterEach void afterEach() { System.out.println("After each test method"); } @AfterAll static void afterAll() { System.out.println("After all test methods"); } @Nested @DisplayName("Tests for the method A") class A { @BeforeEach void beforeEach() { System.out.println("Before each test method of the A class"); } @AfterEach void afterEach() { System.out.println("After each test method of the A class"); } @Test @DisplayName("Example test for method A") void sampleTestForMethodA() { System.out.println("Example test for method A"); } } }
Anden , skal vi tilføje en ny indre klasse kaldet WhenX
til A
klasse og anmærk den indre klasse med @Nested
anmærkning. Efter at vi har oprettet WhenX
klasse, er vi nødt til at tilføje en opsætning, nedtagning og testmetode til den oprettede indre klasse.
Efter at vi har tilføjet denne indre klasse til A
klasse, ser kildekoden til vores testklasse således ud:
import org.junit.jupiter.api.*; @DisplayName("JUnit 5 Nested Example") class JUnit5NestedExampleTest { @BeforeAll static void beforeAll() { System.out.println("Before all test methods"); } @BeforeEach void beforeEach() { System.out.println("Before each test method"); } @AfterEach void afterEach() { System.out.println("After each test method"); } @AfterAll static void afterAll() { System.out.println("After all test methods"); } @Nested @DisplayName("Tests for the method A") class A { @BeforeEach void beforeEach() { System.out.println("Before each test method of the A class"); } @AfterEach void afterEach() { System.out.println("After each test method of the A class"); } @Test @DisplayName("Example test for method A") void sampleTestForMethodA() { System.out.println("Example test for method A"); } @Nested @DisplayName("When X is true") class WhenX { @BeforeEach void beforeEach() { System.out.println("Before each test method of the WhenX class"); } @AfterEach void afterEach() { System.out.println("After each test method of the WhenX class"); } @Test @DisplayName("Example test for method A when X is true") void sampleTestForMethodAWhenX() { System.out.println("Example test for method A when X is true"); } } } }
Vi har nu skrevet en testklasse, der indeholder indlejrede tests. Lad os se, hvad der sker, når vi kører vores test.
Køre vores tests
Når vi kører vores test, bør vi se følgende output:
Before all test methods Before each test method Before each test method of the A class Example test for method A After each test method of the A class After each test method Before each test method Before each test method of the A class Before each test method of the WhenX class Example test for method A when X is true After each test method of the WhenX class After each test method of the A class After each test method After all test methods
Med andre ord påberåber JUnit 5 opsætnings- og nedtagningsmetoderne ved at følge konteksthierarkiet for den påkaldte testmetode. Det betyder, at vi kan eliminere duplikatkode ved at placere vores kode det rigtige sted.
Vi har nu skrevet en testklasse, der indeholder indlejrede opsætnings-, teardown- og testmetoder. Vi forstår også påkaldelsesrækkefølgen af disse metoder. Lad os opsummere, hvad vi lærte af dette blogindlæg.
Oversigt
Dette blogindlæg har lært os fem ting:
- Alle indlejrede testklasser skal være ikke-statiske indre klasser.
- Alle indlejrede testklasser skal annoteres med
@Nested
anmærkning. - Dybden af testklassehierarkiet er på ingen måde begrænset.
- En indlejret testklasse kan indeholde testmetoder, én
@BeforeEach
metode og en@AfterEach
metode. - Som standard kan vi ikke tilføje
@BeforeAll
og@AfterAll
metoder til en indlejret testklasse.