0
0
JUnittesting~10 mins

Nested class lifecycle in JUnit - Test Execution Trace

Choose your learning style9 modes available
Test Overview

This test demonstrates the lifecycle of nested test classes in JUnit 5. It verifies that the outer and inner test classes run their setup and teardown methods in the correct order, and that test methods inside the nested class execute successfully.

Test Code - JUnit 5
JUnit
import org.junit.jupiter.api.*;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class OuterTest {

    @BeforeAll
    void beforeAllOuter() {
        System.out.println("Outer beforeAll");
    }

    @BeforeEach
    void beforeEachOuter() {
        System.out.println("Outer beforeEach");
    }

    @Test
    void outerTest() {
        System.out.println("Outer test running");
        Assertions.assertTrue(true);
    }

    @Nested
    @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    class InnerTest {

        @BeforeAll
        void beforeAllInner() {
            System.out.println("Inner beforeAll");
        }

        @BeforeEach
        void beforeEachInner() {
            System.out.println("Inner beforeEach");
        }

        @Test
        void innerTest() {
            System.out.println("Inner test running");
            Assertions.assertEquals(2, 1 + 1);
        }

        @AfterEach
        void afterEachInner() {
            System.out.println("Inner afterEach");
        }

        @AfterAll
        void afterAllInner() {
            System.out.println("Inner afterAll");
        }
    }

    @AfterEach
    void afterEachOuter() {
        System.out.println("Outer afterEach");
    }

    @AfterAll
    void afterAllOuter() {
        System.out.println("Outer afterAll");
    }
}
Execution Trace - 14 Steps
StepActionSystem StateAssertionResult
1Test starts - JUnit initializes OuterTest classJUnit test runner ready to execute OuterTest-PASS
2Runs OuterTest @BeforeAll methodOuter beforeAll printed-PASS
3Runs OuterTest @BeforeEach method before outerTestOuter beforeEach printed-PASS
4Runs OuterTest test method outerTestOuter test running printedassertTrue(true) passesPASS
5Runs OuterTest @AfterEach method after outerTestOuter afterEach printed-PASS
6JUnit initializes InnerTest nested classReady to execute InnerTest-PASS
7Runs InnerTest @BeforeAll methodInner beforeAll printed-PASS
8Runs OuterTest @BeforeEach method before innerTestOuter beforeEach printed-PASS
9Runs InnerTest @BeforeEach method before innerTestInner beforeEach printed-PASS
10Runs InnerTest test method innerTestInner test running printedassertEquals(2, 1 + 1) passesPASS
11Runs InnerTest @AfterEach method after innerTestInner afterEach printed-PASS
12Runs OuterTest @AfterEach method after innerTestOuter afterEach printed-PASS
13Runs InnerTest @AfterAll method after all inner testsInner afterAll printed-PASS
14Runs OuterTest @AfterAll method after all testsOuter afterAll printed-PASS
Failure Scenario
Failing Condition: InnerTest @BeforeAll method throws an exception
Execution Trace Quiz - 3 Questions
Test your understanding
Which method runs first when executing the OuterTest class?
AOuterTest @BeforeEach
BOuterTest @BeforeAll
CInnerTest @BeforeAll
DInnerTest @BeforeEach
Key Result
Using nested test classes in JUnit 5 allows organizing related tests with their own lifecycle methods. Outer class lifecycle methods run around all tests, while nested class lifecycle methods run only for their tests, helping keep setup and teardown clear and scoped.