{"id":"080d945e97b86419","repo":"junit-team/junit5","slug":"no-parameterresolver-registered-for-parameter-s","errorCode":null,"errorMessage":"No ParameterResolver registered for parameter [%s] in %s [%s].","messagePattern":"No ParameterResolver registered for parameter \\[(.+?)\\] in (.+?) \\[(.+?)\\]\\.","errorType":"exception","errorClass":"ParameterResolutionException","httpStatus":null,"severity":"error","filePath":"junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java","lineNumber":134,"sourceCode":"\t\tfor (int i = start; i < parameters.length; i++) {\n\t\t\tParameterContext parameterContext = new DefaultParameterContext(parameters[i], i, target);\n\t\t\tvalues[i] = resolveParameter(parameterContext, executable, extensionContext, extensionRegistry);\n\t\t}\n\t\treturn values;\n\t}\n\n\tprivate static @Nullable Object resolveParameter(ParameterContext parameterContext, Executable executable,\n\t\t\tExtensionContextSupplier extensionContext, ExtensionRegistry extensionRegistry) {\n\n\t\ttry {\n\t\t\t// @formatter:off\n\t\t\tList<ParameterResolver> matchingResolvers = extensionRegistry.stream(ParameterResolver.class)\n\t\t\t\t\t.filter(resolver -> resolver.supportsParameter(parameterContext, extensionContext.get(resolver)))\n\t\t\t\t\t.toList();\n\t\t\t// @formatter:on\n\n\t\t\tif (matchingResolvers.isEmpty()) {\n\t\t\t\tthrow new ParameterResolutionException(\n\t\t\t\t\t\"No ParameterResolver registered for parameter [%s] in %s [%s].\".formatted(\n\t\t\t\t\t\tparameterContext.getParameter(), asLabel(executable), executable.toGenericString()));\n\t\t\t}\n\n\t\t\tif (matchingResolvers.size() > 1) {\n\t\t\t\t// @formatter:off\n\t\t\t\tString resolvers = matchingResolvers.stream()\n\t\t\t\t\t\t.map(StringUtils::defaultToString)\n\t\t\t\t\t\t.collect(joining(\", \"));\n\t\t\t\t// @formatter:on\n\t\t\t\tthrow new ParameterResolutionException(\n\t\t\t\t\t\"Discovered multiple competing ParameterResolvers for parameter [%s] in %s [%s]: %s\".formatted(\n\t\t\t\t\t\tparameterContext.getParameter(), asLabel(executable), executable.toGenericString(), resolvers));\n\t\t\t}\n\n\t\t\tParameterResolver resolver = matchingResolvers.get(0);\n\t\t\tObject value = resolver.resolveParameter(parameterContext, extensionContext.get(resolver));\n\t\t\tvalidateResolvedType(parameterContext.getParameter(), value, executable, resolver);","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/junit-team/junit5/blob/956246301e03d757539f7b76dd5a91f298637563/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java#L116-L152","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\n@Test\nvoid test(MyService svc) { ... } // no resolver for MyService\n\n// after — register a resolver\n@ExtendWith(MyServiceResolver.class)\n@Test\nvoid test(@MyAnnotation MyService svc) { ... }","handlingStrategy":"validation","validationCode":"// Before running, enumerate parameters and confirm a resolver supports each\nfor (Parameter p : method.getParameters()) {\n    boolean supported = registeredResolvers.stream().anyMatch(r -> safeSupports(r, p));\n    if (!supported) throw new IllegalStateException(\"No resolver for \" + p + \" on \" + method);\n}","typeGuard":"static boolean isResolvable(Parameter p, List<ParameterResolver> resolvers, ExtensionContext ctx) {\n    ParameterContext pc = new DefaultParameterContext(p, 0, null);\n    return resolvers.stream().filter(r -> r.supportsParameter(pc, ctx)).count() == 1;\n}","tryCatchPattern":null,"preventionTips":["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."],"tags":["junit-jupiter","parameter-resolution","extension","configuration"],"analyzedSha":"956246301e03d757539f7b76dd5a91f298637563","analyzedAt":"2026-08-04T19:25:17.049Z","schemaVersion":2}