{"record":{"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/f070c699a08b5d8393df9afd147af5c5e90bb21b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java#L156-L192","documentation":"Generic wrapper thrown when the chosen ParameterResolver.resolveParameter throws any non-unrecoverable Throwable during parameter resolution. It attaches the resolver-independent context (parameter, executable label, generic signature) and appends the underlying message. ParameterResolutionException from the resolver itself (e.g. the no-resolver / multi-resolver cases) is rethrown as-is without wrapping.","triggerScenarios":"resolver.resolveParameter(...) throws - e.g. resolver cannot contact its backing service, reflection on the parameter fails, resolver logic has a bug, or the underlying factory object construction fails.","commonSituations":"A Testcontainers/HttpClient resolver whose backing resource is unavailable; a resolver that calls a remote service to build the parameter; misbehaving third-party extension throwing inside resolveParameter; missing config the resolver needs.","solutions":["Read the appended ': <cause message>' suffix to locate the underlying resolver failure and fix it.","Verify all configuration the resolver needs (system properties, env vars, base URLs) is present at test time.","If you own the resolver, throw ParameterResolutionException directly with a helpful message so users see it unwrapped."],"exampleFix":"// before\n@Override\npublic Object resolveParameter(ParameterContext pc, ExtensionContext ec) {\n    return client.findBean(pc.getParameter().getType()); // throws when service down\n}\n// after\n@Override\npublic Object resolveParameter(ParameterContext pc, ExtensionContext ec) {\n    Class<?> t = pc.getParameter().getType();\n    if (!client.isAvailable())\n        throw new ParameterResolutionException(\"resolver backend unavailable\");\n    return client.findBean(t);\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    runTests(MyTest.class);\n} catch (ParameterResolutionException e) {\n    log.error(\"parameter resolution failed: {}\", e.getMessage(), e.getCause());\n    throw e;\n}","preventionTips":["Throw ParameterResolutionException directly from your resolver with a helpful message.","Verify resolver dependencies (services, config) are available before resolveParameter runs.","Unit-test resolveParameter in isolation to catch failures outside the JUnit lifecycle."],"tags":["parameter-resolution","parameter-resolver","wrapper","extension"],"backgroundTag":null,"analyzedSha":"f070c699a08b5d8393df9afd147af5c5e90bb21b","analyzedAt":"2026-08-11T20:31:00.530Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}