ParameterResolver helps tests get needed values automatically. It makes tests cleaner and easier to read.
ParameterResolver extension in JUnit
public class MyParameterResolver implements ParameterResolver { @Override public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) { // Return true if this resolver supports the parameter return false; // placeholder implementation } @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) { // Return the object to inject return null; // placeholder implementation } }
The supportsParameter method checks if the resolver can provide a value for a parameter.
The resolveParameter method returns the actual value to inject into the test.
public class StringParameterResolver implements ParameterResolver { @Override public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) { return parameterContext.getParameter().getType() == String.class; } @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) { return "Injected String"; } }
@ExtendWith(StringParameterResolver.class) public class MyTest { @Test void testWithInjectedString(String injected) { assertEquals("Injected String", injected); } }
This example shows a ParameterResolver that injects the number 42 into test methods that ask for an Integer. The test checks the value and prints it.
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolver; import static org.junit.jupiter.api.Assertions.assertEquals; public class ParameterResolverExample { public static class NumberParameterResolver implements ParameterResolver { @Override public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) { return parameterContext.getParameter().getType() == Integer.class; } @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) { return 42; } } @ExtendWith(NumberParameterResolver.class) public static class MyTest { @Test void testInjectedNumber(Integer number) { assertEquals(42, number); System.out.println("Injected number is: " + number); } } }
ParameterResolver helps avoid manual setup in tests.
Always check parameter type carefully in supportsParameter.
Use @ExtendWith to apply your resolver to test classes.
ParameterResolver injects values into test method parameters automatically.
It requires implementing two methods: supportsParameter and resolveParameter.
Use it to make tests cleaner and reduce repeated setup code.
Practice
ParameterResolver in JUnit 5?Solution
Step 1: Understand ParameterResolver role
A ParameterResolver is designed to supply values to parameters of test methods automatically, so tests don't need manual setup for those parameters.Step 2: Compare with other options
Options A, C, and D relate to other testing features but not to parameter injection.Final Answer:
To automatically provide values for test method parameters -> Option DQuick Check:
ParameterResolver = automatic parameter injection [OK]
- Confusing ParameterResolver with test ordering
- Thinking it creates mocks automatically
- Assuming it generates reports
ParameterResolver in JUnit 5?Solution
Step 1: Recall ParameterResolver interface methods
The ParameterResolver interface requires implementingsupportsParameterto check if a parameter is supported, andresolveParameterto provide the value.Step 2: Eliminate incorrect method pairs
Options A, B, and C list methods unrelated to ParameterResolver interface.Final Answer:
supportsParameter and resolveParameter -> Option AQuick Check:
ParameterResolver methods = supportsParameter + resolveParameter [OK]
- Confusing lifecycle methods with resolver methods
- Using incorrect method names
- Assuming initialization methods are required
class MyResolver implements ParameterResolver {
public boolean supportsParameter(ParameterContext pc, ExtensionContext ec) {
return pc.getParameter().getType() == String.class;
}
public Object resolveParameter(ParameterContext pc, ExtensionContext ec) {
return "InjectedValue";
}
}
@ExtendWith(MyResolver.class)
class TestClass {
@Test
void testMethod(String param) {
System.out.println(param);
}
}Solution
Step 1: Analyze supportsParameter method
It returns true only if the parameter type is String, so the test method's String param is supported.Step 2: Analyze resolveParameter method
It returns the string "InjectedValue", so this value will be injected into the test method parameter.Final Answer:
InjectedValue -> Option BQuick Check:
Parameter injection prints InjectedValue [OK]
- Assuming parameter is null if not supported
- Expecting compilation error due to interface methods
- Thinking test fails without explicit parameter value
class FaultyResolver implements ParameterResolver {
public boolean supportsParameter(ParameterContext pc, ExtensionContext ec) {
return pc.getParameter().getType() == Integer.class;
}
public Object resolveParameter(ParameterContext pc, ExtensionContext ec) {
return 42;
}
}
@ExtendWith(FaultyResolver.class)
class TestClass {
@Test
void testMethod(int param) {
System.out.println(param);
}
}Solution
Step 1: Check parameter type in supportsParameter
The test method parameter is primitiveint, but supportsParameter checks forInteger.class, which is the wrapper class. This causes supportsParameter to return false.Step 2: Understand consequence of mismatch
Because supportsParameter returns false, resolveParameter is never called, so the parameter is not injected, causing test failure or default value usage.Final Answer:
supportsParameter checks for Integer.class but parameter is primitive int -> Option CQuick Check:
Primitive vs wrapper mismatch breaks supportsParameter [OK]
- Ignoring difference between int and Integer
- Assuming @Override annotations are mandatory
- Thinking resolveParameter type must differ
String. Which implementation correctly achieves this and ensures a new UUID is generated for each test invocation?Solution
Step 1: Understand requirement for unique UUID per test
Each test invocation should get a new UUID string, so the UUID must be generated fresh every timeresolveParameteris called.Step 2: Evaluate options for UUID generation
InresolveParameter, returnUUID.randomUUID().toString()without caching generates a new UUID string on each call, fulfilling the requirement. Options B, C, and D cache or fix the UUID, so they do not produce unique values per test.Final Answer:
In resolveParameter, return UUID.randomUUID().toString() without caching -> Option AQuick Check:
Generate UUID fresh in resolveParameter for uniqueness [OK]
- Caching UUID and returning same value every time
- Generating UUID once in constructor
- Returning fixed string instead of UUID
Ready to prove it?
Pass the test and this pattern moves unknown
