junit-team/junit5 · error · ParameterResolutionException
No ParameterResolver registered for parameter [%s] in %s [%s
Error message
No ParameterResolver registered for parameter [%s] in %s [%s].
What it means
Thrown by ParameterResolutionUtils.resolveParameter() when, for a given parameter, no registered ParameterResolver returns true from supportsParameter(). The message names the parameter, whether it is in a constructor or method, and the executable's generic signature, so the developer can locate the unresolved parameter.
Source
Thrown at junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java:134
for (int i = start; i < parameters.length; i++) {
ParameterContext parameterContext = new DefaultParameterContext(parameters[i], i, target);
values[i] = resolveParameter(parameterContext, executable, extensionContext, extensionRegistry);
}
return values;
}
private static @Nullable Object resolveParameter(ParameterContext parameterContext, Executable executable,
ExtensionContextSupplier extensionContext, ExtensionRegistry extensionRegistry) {
try {
// @formatter:off
List<ParameterResolver> matchingResolvers = extensionRegistry.stream(ParameterResolver.class)
.filter(resolver -> resolver.supportsParameter(parameterContext, extensionContext.get(resolver)))
.toList();
// @formatter:on
if (matchingResolvers.isEmpty()) {
throw new ParameterResolutionException(
"No ParameterResolver registered for parameter [%s] in %s [%s].".formatted(
parameterContext.getParameter(), asLabel(executable), executable.toGenericString()));
}
if (matchingResolvers.size() > 1) {
// @formatter:off
String resolvers = matchingResolvers.stream()
.map(StringUtils::defaultToString)
.collect(joining(", "));
// @formatter:on
throw new ParameterResolutionException(
"Discovered multiple competing ParameterResolvers for parameter [%s] in %s [%s]: %s".formatted(
parameterContext.getParameter(), asLabel(executable), executable.toGenericString(), resolvers));
}
ParameterResolver resolver = matchingResolvers.get(0);
Object value = resolver.resolveParameter(parameterContext, extensionContext.get(resolver));
validateResolvedType(parameterContext.getParameter(), value, executable, resolver);View on GitHub (pinned to 956246301e)
Solutions
- Annotate the parameter correctly (e.g. @TempDir, @Mock, @CsvSource-driven) or remove it if unused.
- Register a ParameterResolver that supports the parameter via @ExtendWith/@RegisterExtension.
- Check that the extension jar is on the classpath; a missing Mockito/Testcontainers dependency means its resolver is absent.
- For TestInfo/TestReporter — these are built in, so their absence indicates a deeper engine misconfiguration.
Example fix
// before
@Test
void test(MyService svc) { ... } // no resolver for MyService
// after — register a resolver
@ExtendWith(MyServiceResolver.class)
@Test
void test(@MyAnnotation MyService svc) { ... } Defensive patterns
Strategy: validation
Validate before calling
// Before running, enumerate parameters and confirm a resolver supports each
for (Parameter p : method.getParameters()) {
boolean supported = registeredResolvers.stream().anyMatch(r -> safeSupports(r, p));
if (!supported) throw new IllegalStateException("No resolver for " + p + " on " + method);
} Type guard
static boolean isResolvable(Parameter p, List<ParameterResolver> resolvers, ExtensionContext ctx) {
ParameterContext pc = new DefaultParameterContext(p, 0, null);
return resolvers.stream().filter(r -> r.supportsParameter(pc, ctx)).count() == 1;
} Prevention
- Annotate parameters that need an annotation (e.g. @Mock, @TempDir).
- Ensure the extension jar providing the resolver is on the classpath.
- Remove unused parameters from test/lifecycle methods.
When it happens
Trigger: Declaring a parameter in a test constructor, @Test/@BeforeEach/@AfterAll/etc. method, or @TestFactory method that has no matching ParameterResolver — e.g. a custom type with no extension, a TestInfo parameter when no such resolver is registered (normally built-in), or a parameter with a missing @Mock/@TempDir annotation.
Common situations: Forgetting to annotate a parameter that requires an annotation (e.g. @Mock, @TempDir, @RegisterExtension); declaring a parameter of a type no extension supplies; disabling or failing to register an extension that previously resolved the parameter after an upgrade.
Related errors
- Failed to create output directory
- The following TestInstanceFactory extensions were registered
- Discovered multiple competing ParameterResolvers for paramet
- Failed to resolve parameter [%s] in %s [%s]
- Failed to publish path
AI-assisted analysis of junit-team/junit5@956246301e (2026-08-04).
Data as JSON: /data/errors/080d945e97b86419.json.
Report an issue: GitHub.