Challenge - 5 Problems
JUnit 5 Custom Extension Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate2:00remaining
Output of a JUnit 5 custom extension with BeforeEachCallback
What will be printed when this JUnit 5 test class runs with the custom extension?
JUnit
import org.junit.jupiter.api.extension.*; import org.junit.jupiter.api.*; class MyExtension implements BeforeEachCallback { @Override public void beforeEach(ExtensionContext context) { System.out.println("Setup before each test"); } } @ExtendWith(MyExtension.class) class SampleTest { @Test void testOne() { System.out.println("Running testOne"); } @Test void testTwo() { System.out.println("Running testTwo"); } }
Attempts:
2 left
💡 Hint
Remember that BeforeEachCallback runs before each test method.
✗ Incorrect
The custom extension implements BeforeEachCallback, so its beforeEach method runs before each test method. Therefore, the message 'Setup before each test' prints before each test's output.
❓ assertion
intermediate2:00remaining
Correct assertion to verify extension invocation count
Given a custom JUnit 5 extension that increments a counter each time beforeEach is called, which assertion correctly verifies that the counter equals 3 after running 3 tests?
JUnit
class CountingExtension implements BeforeEachCallback { static int count = 0; @Override public void beforeEach(ExtensionContext context) { count++; } } // After running 3 tests, check count value
Attempts:
2 left
💡 Hint
Use the standard JUnit assertion method with expected value first.
✗ Incorrect
assertEquals(expected, actual) expects the expected value as the first argument. Option A uses this correctly. Option A reverses arguments which is not recommended and may cause confusing error messages.
🔧 Debug
advanced2:00remaining
Identify the error in this custom extension implementation
What error will occur when running this JUnit 5 extension code?
JUnit
import org.junit.jupiter.api.extension.*; public class FaultyExtension implements BeforeAllCallback { @Override public void beforeAll(ExtensionContext context) { System.out.println("Before all tests"); } public void beforeEach(ExtensionContext context) { System.out.println("Before each test"); } }
Attempts:
2 left
💡 Hint
Check which interfaces the class implements and which methods are called by JUnit.
✗ Incorrect
The class implements BeforeAllCallback, so only beforeAll is called by JUnit. The beforeEach method is a plain method without @Override and not part of any interface implemented, so it is never called.
❓ framework
advanced2:00remaining
Which JUnit 5 extension point allows modifying test instance before each test?
You want to create a custom extension that modifies the test class instance before each test method runs. Which extension point should you implement?
Attempts:
2 left
💡 Hint
Consider which extension point allows you to access and modify the test instance itself.
✗ Incorrect
TestInstancePostProcessor allows you to modify the test instance after it is created but before any tests run. BeforeEachCallback runs before each test but does not provide the test instance for modification.
🧠 Conceptual
expert2:00remaining
Effect of registering multiple extensions with conflicting callbacks
If two JUnit 5 extensions both implement BeforeEachCallback and are registered on the same test class, what is the expected behavior during test execution?
Attempts:
2 left
💡 Hint
Think about how JUnit 5 handles multiple extensions implementing the same callback.
✗ Incorrect
JUnit 5 calls all registered extensions' callback methods in the order they are registered. So both beforeEach methods run before each test.