Bird
Raised Fist0
JUnittesting~5 mins

ParameterResolver extension in JUnit - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a ParameterResolver in JUnit?
A ParameterResolver is an extension in JUnit that allows you to provide parameters to test methods dynamically at runtime.
Click to reveal answer
beginner
Which two methods must be implemented in a ParameterResolver?
You must implement supportsParameter() to check if the parameter can be resolved, and resolveParameter() to provide the actual parameter value.
Click to reveal answer
intermediate
How does JUnit decide to use a ParameterResolver for a test method parameter?
JUnit calls supportsParameter() on registered ParameterResolvers. If it returns true, JUnit uses resolveParameter() to get the value to inject.
Click to reveal answer
beginner
Why use ParameterResolver instead of hardcoding test data?
ParameterResolver helps keep tests clean and reusable by injecting dependencies or test data dynamically, avoiding hardcoded values.
Click to reveal answer
intermediate
Show a simple example of a ParameterResolver that provides a String parameter.
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolver;

public class SimpleStringResolver implements ParameterResolver {
  @Override
  public boolean supportsParameter(ParameterContext pc, ExtensionContext ec) {
    return pc.getParameter().getType() == String.class;
  }

  @Override
  public Object resolveParameter(ParameterContext pc, ExtensionContext ec) {
    return "Injected String";
  }
}
Click to reveal answer
What does the supportsParameter() method do in a ParameterResolver?
AProvides the actual parameter value
BChecks if the resolver can provide a value for the parameter
CRuns the test method
DRegisters the extension
Which annotation is used to register a ParameterResolver in JUnit 5?
A@Test
B@BeforeEach
C@ExtendWith
D@ParameterResolver
What type of parameters can a ParameterResolver inject?
AAny type supported by the resolver
BOnly Strings
COnly objects with default constructors
DOnly primitive types
When is resolveParameter() called during test execution?
ABefore supportsParameter()
BOnly if the test fails
CAfter the test method finishes
DAfter supportsParameter() returns true
What is the main benefit of using ParameterResolver in tests?
ATo inject parameters dynamically and improve test flexibility
BTo write tests faster by skipping assertions
CTo run tests in parallel
DTo automatically generate test data
Explain how a ParameterResolver works in JUnit and why it is useful.
Think about how JUnit decides what value to pass to a test method parameter.
You got /4 concepts.
    Describe the steps to create and use a custom ParameterResolver in a JUnit test.
    Focus on the interface methods and how to connect the resolver to the test.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of a ParameterResolver in JUnit 5?
      easy
      A. To define the order of test execution
      B. To generate test reports after execution
      C. To create mock objects for tests
      D. To automatically provide values for test method parameters

      Solution

      1. 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.
      2. Step 2: Compare with other options

        Options A, C, and D relate to other testing features but not to parameter injection.
      3. Final Answer:

        To automatically provide values for test method parameters -> Option D
      4. Quick Check:

        ParameterResolver = automatic parameter injection [OK]
      Hint: ParameterResolver injects parameters automatically [OK]
      Common Mistakes:
      • Confusing ParameterResolver with test ordering
      • Thinking it creates mocks automatically
      • Assuming it generates reports
      2. Which two methods must a class implement to be a valid ParameterResolver in JUnit 5?
      easy
      A. supportsParameter and resolveParameter
      B. beforeEach and afterEach
      C. initialize and cleanup
      D. createParameter and validateParameter

      Solution

      1. Step 1: Recall ParameterResolver interface methods

        The ParameterResolver interface requires implementing supportsParameter to check if a parameter is supported, and resolveParameter to provide the value.
      2. Step 2: Eliminate incorrect method pairs

        Options A, B, and C list methods unrelated to ParameterResolver interface.
      3. Final Answer:

        supportsParameter and resolveParameter -> Option A
      4. Quick Check:

        ParameterResolver methods = supportsParameter + resolveParameter [OK]
      Hint: Remember: supportsParameter checks, resolveParameter provides [OK]
      Common Mistakes:
      • Confusing lifecycle methods with resolver methods
      • Using incorrect method names
      • Assuming initialization methods are required
      3. Given this ParameterResolver implementation, what will be printed when the test runs?
      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);
        }
      }
      medium
      A. null
      B. InjectedValue
      C. Compilation error
      D. Test fails with exception

      Solution

      1. Step 1: Analyze supportsParameter method

        It returns true only if the parameter type is String, so the test method's String param is supported.
      2. Step 2: Analyze resolveParameter method

        It returns the string "InjectedValue", so this value will be injected into the test method parameter.
      3. Final Answer:

        InjectedValue -> Option B
      4. Quick Check:

        Parameter injection prints InjectedValue [OK]
      Hint: Check supportsParameter return true for parameter type [OK]
      Common Mistakes:
      • Assuming parameter is null if not supported
      • Expecting compilation error due to interface methods
      • Thinking test fails without explicit parameter value
      4. Identify the error in this ParameterResolver implementation:
      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);
        }
      }
      medium
      A. Missing @Override annotations cause runtime error
      B. resolveParameter returns wrong type
      C. supportsParameter checks for Integer.class but parameter is primitive int
      D. Test method parameter must be Integer, not int

      Solution

      1. Step 1: Check parameter type in supportsParameter

        The test method parameter is primitive int, but supportsParameter checks for Integer.class, which is the wrapper class. This causes supportsParameter to return false.
      2. 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.
      3. Final Answer:

        supportsParameter checks for Integer.class but parameter is primitive int -> Option C
      4. Quick Check:

        Primitive vs wrapper mismatch breaks supportsParameter [OK]
      Hint: Match primitive and wrapper types carefully in supportsParameter [OK]
      Common Mistakes:
      • Ignoring difference between int and Integer
      • Assuming @Override annotations are mandatory
      • Thinking resolveParameter type must differ
      5. You want to create a ParameterResolver that injects a unique UUID string into any test method parameter of type String. Which implementation correctly achieves this and ensures a new UUID is generated for each test invocation?
      hard
      A. In resolveParameter, return UUID.randomUUID().toString() without caching
      B. In supportsParameter, cache a UUID and return it for all calls
      C. Return a fixed UUID string in resolveParameter for all tests
      D. Generate UUID once in constructor and return it in resolveParameter

      Solution

      1. 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 time resolveParameter is called.
      2. Step 2: Evaluate options for UUID generation

        In resolveParameter, return UUID.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.
      3. Final Answer:

        In resolveParameter, return UUID.randomUUID().toString() without caching -> Option A
      4. Quick Check:

        Generate UUID fresh in resolveParameter for uniqueness [OK]
      Hint: Generate new UUID inside resolveParameter method [OK]
      Common Mistakes:
      • Caching UUID and returning same value every time
      • Generating UUID once in constructor
      • Returning fixed string instead of UUID
      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