Nested class lifecycle in JUnit - Build an Automation Script
import org.junit.jupiter.api.*; import java.util.ArrayList; import java.util.List; @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class NestedLifecycleTest { private final List<String> lifecycleOrder = new ArrayList<>(); @BeforeAll static void beforeAllTop() { System.out.println("Top-level BeforeAll"); } @AfterAll static void afterAllTop() { System.out.println("Top-level AfterAll"); } @BeforeEach void beforeEachTop() { lifecycleOrder.add("Top BeforeEach"); } @AfterEach void afterEachTop() { lifecycleOrder.add("Top AfterEach"); } @Nested class InnerNested { @BeforeEach void beforeEachNested() { lifecycleOrder.add("Nested BeforeEach"); } @AfterEach void afterEachNested() { lifecycleOrder.add("Nested AfterEach"); } @Test void nestedTest() { lifecycleOrder.add("Nested Test"); Assertions.assertTrue(true); } } @Test void verifyLifecycleOrder() { // Run nested test manually to capture lifecycle order InnerNested nested = new InnerNested(); nested.beforeEachNested(); nested.nestedTest(); nested.afterEachNested(); // Top-level beforeEach and afterEach should be called around nested test // Simulate top-level lifecycle calls beforeEachTop(); afterEachTop(); // Check that lifecycleOrder contains expected sequence List<String> expectedOrder = List.of( "Top BeforeEach", "Nested BeforeEach", "Nested Test", "Nested AfterEach", "Top AfterEach" ); Assertions.assertEquals(expectedOrder, lifecycleOrder); } }
This test class demonstrates the lifecycle of JUnit 5 nested classes.
The NestedLifecycleTest class has lifecycle methods annotated with @BeforeAll, @AfterAll, @BeforeEach, and @AfterEach. The nested class InnerNested also has @BeforeEach and @AfterEach methods and a test method.
We use a List<String> to record the order of lifecycle method calls and the test execution.
The verifyLifecycleOrder test method manually calls the nested lifecycle methods and test to simulate the order and then asserts the recorded order matches the expected sequence.
This approach helps verify the nested class lifecycle behavior clearly and ensures the test passes if the lifecycle methods run in the correct order.
Now add data-driven testing to the nested test method with 3 different input strings verifying they are not empty