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

  1. Annotate the parameter correctly (e.g. @TempDir, @Mock, @CsvSource-driven) or remove it if unused.
  2. Register a ParameterResolver that supports the parameter via @ExtendWith/@RegisterExtension.
  3. Check that the extension jar is on the classpath; a missing Mockito/Testcontainers dependency means its resolver is absent.
  4. 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

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


AI-assisted analysis of junit-team/junit5@956246301e (2026-08-04). Data as JSON: /data/errors/080d945e97b86419.json. Report an issue: GitHub.