What is the purpose of the @BeforeAll method in JUnit?
The @BeforeAll method runs once before all test methods in a test class. It is used to set up shared resources or configurations needed for all tests.
Click to reveal answer
beginner
When is the @BeforeAll method executed in the test lifecycle?
It is executed exactly one time before any test methods run in the test class.
Click to reveal answer
intermediate
What must be true about a @BeforeAll method in JUnit 5 regarding its declaration?
The <code>@BeforeAll</code> method must be static unless the test class is annotated with <code>@TestInstance(TestInstance.Lifecycle.PER_CLASS)</code>.
Click to reveal answer
beginner
Example: How do you write a @BeforeAll method to initialize a database connection?
Why should you avoid putting test assertions inside a @BeforeAll method?
Because @BeforeAll is for setup only. Assertions belong in test methods to clearly show which test failed.
Click to reveal answer
What is true about a @BeforeAll method in JUnit 5 by default?
AIt must be static.
BIt runs before each test method.
CIt can only be private.
DIt runs after all tests.
✗ Incorrect
By default, @BeforeAll methods must be static because they run once before all tests.
Which annotation allows @BeforeAll methods to be non-static?
A@TestInstance(Lifecycle.PER_CLASS)
B@BeforeEach
C@AfterAll
D@Test
✗ Incorrect
Using @TestInstance(Lifecycle.PER_CLASS) lets @BeforeAll methods be instance methods (non-static).
How many times does a @BeforeAll method run in a test class?
ANever
BBefore each test
CAfter each test
DOnce before all tests
✗ Incorrect
@BeforeAll runs exactly once before any tests in the class.
Where should you put code that needs to run before every test method?
A@BeforeAll method
B@AfterAll method
C@BeforeEach method
DInside the test method
✗ Incorrect
@BeforeEach runs before every test method, unlike @BeforeAll.
Which of these is a good use case for @BeforeAll?
AChecking test results
BOpening a database connection once for all tests
CResetting test data before each test
DCleaning up after tests
✗ Incorrect
@BeforeAll is ideal for one-time setup like opening a database connection.
Explain the role and requirements of the @BeforeAll method in JUnit testing.
Think about when and how often setup code should run.
You got /4 concepts.
Describe a scenario where using @BeforeAll is better than @BeforeEach.
Consider efficiency and resource sharing.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of the @BeforeAll annotation in JUnit 5?
easy
A. To run a method once after all test methods
B. To run a method before each test method
C. To run a method after each test method
D. To run a method once before all test methods in the class
Solution
Step 1: Understand the role of @BeforeAll
The @BeforeAll annotation marks a method to run once before any test methods in the class.
Step 2: Compare with other lifecycle annotations
@BeforeEach runs before each test, @AfterEach runs after each test, and @AfterAll runs once after all tests.
Final Answer:
To run a method once before all test methods in the class -> Option D
Quick Check:
@BeforeAll = run once before all tests [OK]
Hint: Runs once before all tests, not before each [OK]
Common Mistakes:
Confusing @BeforeAll with @BeforeEach
Thinking it runs after tests
Assuming it runs multiple times
2. Which of the following is the correct way to declare a @BeforeAll method in JUnit 5?
easy
A. public void setup() { ... }
B. private static void setup() { ... }
C. public static void setup() { ... }
D. void setup() { ... }
Solution
Step 1: Recall method requirements for @BeforeAll
In JUnit 5, @BeforeAll methods must be static and public (or package-private) to run before all tests.
Step 2: Check each option's signature
public void setup() { ... } is non-static, so invalid. private static void setup() { ... } is private, so invalid. void setup() { ... } is non-static and missing access modifier. public static void setup() { ... } is public static void, which is correct.
Final Answer:
public static void setup() { ... } -> Option C
Quick Check:
Static + public method = correct @BeforeAll signature [OK]
Hint: Must be static and public for @BeforeAll [OK]
Common Mistakes:
Omitting static keyword
Using private or protected access
Missing void return type
3. Consider the following JUnit 5 test class snippet:
public class SampleTest {
static int counter = 0;
@BeforeAll
public static void init() {
counter = 5;
}
@Test
public void testOne() {
counter += 1;
assertEquals(6, counter);
}
@Test
public void testTwo() {
counter += 2;
assertEquals(7, counter);
}
}
What will happen when these tests run?
medium
A. testOne passes, testTwo fails
B. Both tests pass
C. testOne fails, testTwo passes
D. Both tests fail
Solution
Step 1: Analyze @BeforeAll effect on counter
The init() method sets counter = 5 once before all tests.
Step 2: Trace testOne execution
testOne adds 1 to counter (5 + 1 = 6) and asserts 6, so it passes.
Step 3: Trace testTwo execution
testTwo adds 2 to counter, but counter was modified by testOne and is now 6, so 6 + 2 = 8. It asserts 7, which fails.
Final Answer:
testOne passes, testTwo fails -> Option A
Quick Check:
Shared static state changes cause testTwo failure [OK]
Hint: Static state shared; second test sees changed value [OK]
Common Mistakes:
Assuming counter resets before each test
Ignoring static variable persistence
Expecting both tests to pass
4. Given this JUnit 5 test class:
public class DemoTest {
@BeforeAll
public void setup() {
System.out.println("Setup");
}
@Test
public void testA() {
assertTrue(true);
}
}
What is the problem with this code?
medium
A. The @Test method must be static
B. The @BeforeAll method must be static
C. The @BeforeAll method cannot print output
D. The @BeforeAll method must return a value
Solution
Step 1: Check @BeforeAll method signature
In JUnit 5, @BeforeAll methods must be static unless using a test instance lifecycle that allows non-static.
Step 2: Identify error in code
The setup() method is non-static, which causes a runtime error or test failure.
Final Answer:
The @BeforeAll method must be static -> Option B
Quick Check:
@BeforeAll requires static method [OK]
Hint: Remember: @BeforeAll methods must be static [OK]
Common Mistakes:
Making @BeforeAll method non-static
Thinking @BeforeAll can return values
Confusing @BeforeAll with @BeforeEach
5. You want to initialize a database connection once before all tests in a JUnit 5 test class. Which approach correctly uses @BeforeAll to achieve this, considering best practices?
hard
A. Use a static @BeforeAll method to open the connection and store it in a static variable
B. Use a non-static @BeforeAll method to open the connection
C. Open the connection inside each @Test method separately
D. Use @BeforeEach to open the connection before every test
Solution
Step 1: Understand @BeforeAll usage for shared setup
@BeforeAll runs once before all tests, ideal for expensive setup like database connections.
Step 2: Apply static method and static variable for shared resource
The method must be static, and the connection should be stored in a static variable to be accessible by all tests.
Step 3: Evaluate other options
Use a non-static @BeforeAll method to open the connection is invalid because @BeforeAll must be static. Open the connection inside each @Test method separately and D open connection multiple times, which is inefficient.
Final Answer:
Use a static @BeforeAll method to open the connection and store it in a static variable -> Option A