Bird
Raised Fist0
JUnittesting

Nested class lifecycle in JUnit - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a nested test class in JUnit?
A nested test class is a static or non-static inner class inside a test class used to group related tests together for better organization and readability.
Click to reveal answer
intermediate
How does the lifecycle of a nested test class differ from the outer test class in JUnit?
Each nested test class has its own lifecycle: its @BeforeAll and @AfterAll methods run before and after all tests in that nested class, separate from the outer class lifecycle.
Click to reveal answer
beginner
Which JUnit annotation is used to define a nested test class?
The @Nested annotation is used to mark a class inside a test class as a nested test class.
Click to reveal answer
intermediate
Can @BeforeAll methods in nested classes be non-static in JUnit 5?
Yes, in nested test classes, @BeforeAll and @AfterAll methods can be non-static because JUnit creates a new instance of the nested class for running tests.
Click to reveal answer
beginner
Why use nested test classes in JUnit?
Nested test classes help organize tests into logical groups, making tests easier to read and maintain, especially when testing different scenarios or states of the same class.
Click to reveal answer
Which annotation marks a nested test class in JUnit?
A@InnerTest
B@Nested
C@TestClass
D@SubTest
In JUnit, when are @BeforeAll methods in a nested class executed?
ABefore all tests in the nested class
BBefore all tests in the outer class
CBefore each test method in the nested class
DAfter all tests in the nested class
Can @BeforeAll methods in nested classes be non-static in JUnit 5?
AOnly if the outer class is static
BNo, never
CYes, always
DYes, because JUnit creates a new instance of the nested class
What is the main benefit of using nested test classes?
ABetter test organization and readability
BAutomatic parallel test running
CFaster test execution
DSimplifies mocking dependencies
Which lifecycle methods are scoped to a nested test class?
A@BeforeEach and @AfterEach only
B@BeforeAll and @AfterAll only
C@BeforeAll, @AfterAll, @BeforeEach, and @AfterEach
DNone of the above
Explain how the lifecycle of nested test classes works in JUnit and how it differs from the outer test class lifecycle.
Think about how setup and teardown happen inside nested classes compared to the outer class.
You got /4 concepts.
    Describe the advantages of using nested test classes in organizing your JUnit tests.
    Consider how nested classes help when testing multiple states or behaviors of the same class.
    You got /4 concepts.

      Practice

      (1/5)
      1. In JUnit 5, what is the purpose of using a @Nested class inside a test class?
      easy
      A. To group related tests together for better organization
      B. To run tests in parallel automatically
      C. To disable tests temporarily
      D. To create a separate test suite file

      Solution

      1. Step 1: Understand the role of @Nested

        The @Nested annotation allows grouping related test methods inside inner classes to organize tests logically.
      2. Step 2: Compare other options

        The other options describe unrelated features: disabling tests temporarily, running tests in parallel automatically, and creating separate test suite files, which are not the purpose of @Nested.
      3. Final Answer:

        To group related tests together for better organization -> Option A
      4. Quick Check:

        @Nested groups tests = C [OK]
      Hint: Remember: @Nested groups tests inside main class [OK]
      Common Mistakes:
      • Thinking @Nested runs tests in parallel
      • Confusing @Nested with @Disabled
      • Assuming @Nested creates separate test files
      2. Which lifecycle annotation is used to run a method once before all tests in a @Nested class?
      easy
      A. @BeforeAll
      B. @AfterAll
      C. @AfterEach
      D. @BeforeEach

      Solution

      1. Step 1: Identify lifecycle annotations for nested classes

        In JUnit 5, @BeforeAll runs once before all tests in the class, including nested classes if used inside them.
      2. Step 2: Differentiate from other annotations

        @BeforeEach runs before each test method, not once; @AfterEach and @AfterAll run after tests, so they don't fit the requirement.
      3. Final Answer:

        @BeforeAll -> Option A
      4. Quick Check:

        Run once before all tests = @BeforeAll [OK]
      Hint: Before all tests in nested class use @BeforeAll [OK]
      Common Mistakes:
      • Using @BeforeEach instead of @BeforeAll for once-only setup
      • Confusing @AfterAll with setup annotations
      • Not placing @BeforeAll inside nested class
      3. Consider this JUnit 5 test structure:
      class OuterTest {
        @BeforeAll
        static void setupOuter() { System.out.println("Outer setup"); }
      
        @Nested
        class InnerTest {
          @BeforeAll
          static void setupInner() { System.out.println("Inner setup"); }
      
          @Test
          void testOne() { System.out.println("Test one"); }
        }
      }
      What will be the order of printed lines when running testOne()?
      medium
      A. Inner setup\nOuter setup\nTest one
      B. Outer setup\nInner setup\nTest one
      C. Outer setup\nTest one\nInner setup
      D. Test one\nOuter setup\nInner setup

      Solution

      1. Step 1: Understand lifecycle order in nested classes

        The @BeforeAll in the outer class runs first, then the @BeforeAll in the nested class, followed by the test method.
      2. Step 2: Trace the print statements

        First prints "Outer setup", then "Inner setup", then "Test one" as per the method calls.
      3. Final Answer:

        Outer setup\nInner setup\nTest one -> Option B
      4. Quick Check:

        Outer before all, then inner before all, then test [OK]
      Hint: Outer @BeforeAll runs before nested @BeforeAll [OK]
      Common Mistakes:
      • Assuming nested @BeforeAll runs before outer
      • Mixing order of test and setup prints
      • Forgetting static requirement for @BeforeAll in nested
      4. Given this nested test class, what is the error that prevents @BeforeAll from running?
      class OuterTest {
        @Nested
        class InnerTest {
          @BeforeAll
          void setup() { System.out.println("Setup"); }
      
          @Test
          void test() { System.out.println("Test"); }
        }
      }
      medium
      A. Missing @Test annotation on setup method
      B. @BeforeAll cannot be used inside nested classes
      C. @BeforeAll method must be static in nested classes
      D. InnerTest class must be static

      Solution

      1. Step 1: Check @BeforeAll method requirements in nested classes

        In JUnit 5, @BeforeAll methods inside nested classes must be static unless the nested class is annotated with @TestInstance(Lifecycle.PER_CLASS).
      2. Step 2: Analyze the given code

        The @BeforeAll method is non-static and the nested class is not annotated with @TestInstance, so this causes a runtime error.
      3. Final Answer:

        @BeforeAll method must be static in nested classes -> Option C
      4. Quick Check:

        @BeforeAll in nested must be static unless @TestInstance used [OK]
      Hint: @BeforeAll in nested classes must be static [OK]
      Common Mistakes:
      • Thinking @BeforeAll cannot be used in nested classes
      • Forgetting static keyword on @BeforeAll method
      • Confusing @BeforeAll with @BeforeEach
      5. You want to run a setup method once before all tests in both the outer and nested classes without making the nested class static. Which approach correctly achieves this in JUnit 5?
      hard
      A. Move all tests to the outer class and remove nested classes
      B. Make the nested class static and keep @BeforeAll method static
      C. Use @BeforeEach instead of @BeforeAll in nested class
      D. Annotate the nested class with @TestInstance(Lifecycle.PER_CLASS) and make the @BeforeAll method non-static

      Solution

      1. Step 1: Understand static requirement for @BeforeAll in nested classes

        By default, @BeforeAll methods in nested classes must be static because nested classes are instance classes.
      2. Step 2: Use @TestInstance(Lifecycle.PER_CLASS) to allow non-static @BeforeAll

        Annotating the nested class with @TestInstance(Lifecycle.PER_CLASS) changes lifecycle so @BeforeAll can be non-static, allowing setup without static nested class.
      3. Step 3: Evaluate other options

        Make the nested class static and keep @BeforeAll method static requires static nested class, which is not desired. Use @BeforeEach instead of @BeforeAll in nested class changes setup frequency. Move all tests to the outer class and remove nested classes removes nested structure, losing organization.
      4. Final Answer:

        Annotate the nested class with @TestInstance(Lifecycle.PER_CLASS) and make the @BeforeAll method non-static -> Option D
      5. Quick Check:

        @TestInstance(PER_CLASS) allows non-static @BeforeAll in nested [OK]
      Hint: Use @TestInstance(PER_CLASS) to avoid static @BeforeAll in nested [OK]
      Common Mistakes:
      • Making nested class static when not needed
      • Using @BeforeEach instead of @BeforeAll for once-only setup
      • Removing nested classes to fix lifecycle issues
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard