{"id":"90c3043a7b91c88b","repo":"junit-team/junit5","slug":"failed-to-resolve-parameter-s-in-s-s","errorCode":null,"errorMessage":"Failed to resolve parameter [%s] in %s [%s]","messagePattern":"Failed to resolve 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":174,"sourceCode":"\t\t\t\t\tresolver.getClass().getName(), (value != null ? value.getClass().getTypeName() : null),\n\t\t\t\t\tparameterContext.getParameter(), asLabel(executable), executable.toGenericString()));\n\n\t\t\treturn value;\n\t\t}\n\t\tcatch (ParameterResolutionException ex) {\n\t\t\tthrow ex;\n\t\t}\n\t\tcatch (Throwable throwable) {\n\t\t\tUnrecoverableExceptions.rethrowIfUnrecoverable(throwable);\n\n\t\t\tString message = \"Failed to resolve parameter [%s] in %s [%s]\".formatted(parameterContext.getParameter(),\n\t\t\t\tasLabel(executable), executable.toGenericString());\n\n\t\t\tif (StringUtils.isNotBlank(throwable.getMessage())) {\n\t\t\t\tmessage += \": \" + throwable.getMessage();\n\t\t\t}\n\n\t\t\tthrow new ParameterResolutionException(message, throwable);\n\t\t}\n\t}\n\n\tprivate static void validateResolvedType(Parameter parameter, @Nullable Object value, Executable executable,\n\t\t\tParameterResolver resolver) {\n\n\t\tClass<?> type = parameter.getType();\n\n\t\t// Note: null is permissible as a resolved value but only for non-primitive types.\n\t\tif (!isAssignableTo(value, type)) {\n\t\t\tString message;\n\t\t\tif (value == null && type.isPrimitive()) {\n\t\t\t\tmessage = \"\"\"\n\t\t\t\t\t\tParameterResolver [%s] resolved a null value for parameter [%s] \\\n\t\t\t\t\t\tin %s [%s], but a primitive of type [%s] is required.\"\"\".formatted(\n\t\t\t\t\tresolver.getClass().getName(), parameter, asLabel(executable), executable.toGenericString(),\n\t\t\t\t\ttype.getName());\n\t\t\t}","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/junit-team/junit5/blob/956246301e03d757539f7b76dd5a91f298637563/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java#L156-L192","documentation":"Thrown by ParameterResolutionUtils.resolveParameter() when the single matching ParameterResolver's resolveParameter() throws a non-ParameterResolutionException throwable. The engine rethrows ParameterResolutionException as-is but wraps other throwables (appending their message) so parameter-resolution failures are uniformly typed.","triggerScenarios":"A ParameterResolver.resolveParameter() implementation that throws — e.g. it queries a database/service that is down, performs reflective access that hits an IllegalAccessException, or has a bug that raises a NullPointerException.","commonSituations":"A resolver that loads test data from an external source which is unreachable; a resolver using reflection on a sealed/inaccessible type under Java module restrictions; a resolver with a null-handling bug triggered by a specific parameter shape.","solutions":["Inspect getCause() — it is the original throwable thrown by the resolver.","Fix the resolver's internal failure (external dependency, reflective access, NPE).","If the resolver cannot resolve, throw a ParameterResolutionException directly so the message is not double-wrapped.","For module/reflective access errors, add the appropriate --add-opens to the test JVM args."],"exampleFix":"// before\npublic Object resolveParameter(ParameterContext pc, ExtensionContext ec) {\n    return service.load(pc); // service throws -> wrapped\n}\n// after\npublic Object resolveParameter(ParameterContext pc, ExtensionContext ec) {\n    try { return service.load(pc); }\n    catch (ServiceUnavailableException e) {\n        throw new ParameterResolutionException(\"Cannot load data for \" + pc.getParameter(), e);\n    }\n}","handlingStrategy":"try-catch","validationCode":"// Validate the resolver can resolve outside the test\nObject value;\ntry { value = resolver.resolveParameter(pc, ctx); }\ncatch (Throwable t) { throw new IllegalStateException(\"Resolver throws for \" + pc.getParameter(), t); }","typeGuard":null,"tryCatchPattern":"try {\n    // test runs\n} catch (ParameterResolutionException e) {\n    Throwable root = e.getCause(); // original from resolver\n    log.error(\"resolver failed: {}\", root);\n}","preventionTips":["Make resolveParameter() robust: handle missing external data with a clear ParameterResolutionException.","Add --add-opens for reflective access the resolver needs under JPMS.","Unit-test the resolver in isolation."],"tags":["junit-jupiter","parameter-resolution","extension","wrapper"],"analyzedSha":"956246301e03d757539f7b76dd5a91f298637563","analyzedAt":"2026-08-04T19:25:17.049Z","schemaVersion":2}