{"record":{"id":"f789d66008eb4176","repo":"junit-team/junit5","slug":"parameterresolver-s-resolved-a-value-of-type","errorCode":null,"errorMessage":"ParameterResolver [%s] resolved a value of type [%s] for parameter [%s] in %s [%s], but a value assignment compatible with [%s] is required.","messagePattern":"ParameterResolver \\[(.+?)\\] resolved a value of type \\[(.+?)\\] for parameter \\[(.+?)\\] in (.+?) \\[(.+?)\\], but a value assignment compatible with \\[(.+?)\\] is required\\.","errorType":"exception","errorClass":"ParameterResolutionException","httpStatus":null,"severity":"error","filePath":"junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java","lineNumber":201,"sourceCode":"\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}\n\t\t\telse {\n\t\t\t\tmessage = \"\"\"\n\t\t\t\t\t\tParameterResolver [%s] resolved a value of type [%s] for parameter [%s] \\\n\t\t\t\t\t\tin %s [%s], but a value assignment compatible with [%s] is required.\"\"\".formatted(\n\t\t\t\t\tresolver.getClass().getName(), (value != null ? value.getClass().getTypeName() : null), parameter,\n\t\t\t\t\tasLabel(executable), executable.toGenericString(), type.getTypeName());\n\t\t\t}\n\n\t\t\tthrow new ParameterResolutionException(message);\n\t\t}\n\t}\n\n\tprivate static String asLabel(Executable executable) {\n\t\treturn executable instanceof Constructor ? \"constructor\" : \"method\";\n\t}\n\n\tprivate ParameterResolutionUtils() {\n\t}\n\n}\n","sourceCodeStart":183,"sourceCodeEnd":213,"githubUrl":"https://github.com/junit-team/junit5/blob/f070c699a08b5d8393df9afd147af5c5e90bb21b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java#L183-L213","documentation":"Thrown by validateResolvedType when the value returned by a ParameterResolver.resolveParameter is not assignable to the parameter type. There is a separate branch for the special case where the parameter is primitive and the resolver returned null; otherwise the resolver is named and the resolved type is reported alongside the required type.","triggerScenarios":"validateResolvedType(parameter, value, ...) is called right after resolveParameter; if !isAssignableTo(value, type) the resolver produced the wrong type - e.g. resolver returns a String for an Integer parameter, or returns null for an int primitive parameter.","commonSituations":"Custom resolver returns the cached/wrong object without checking parameter type; resolver returns null for a primitive parameter (int, long, boolean) where null is not permissible; resolver returns a parent type rather than the requested subtype.","solutions":["Make the resolver branch on pc.getParameter().getType() and return the correct concrete type for that parameter.","Never return null for primitive parameters - resolve to the primitive default (0, 0L, false) or a real value.","If the value is genuinely optional, change the parameter to the boxed wrapper type (Integer instead of int)."],"exampleFix":"// before\n@Override public Object resolveParameter(ParameterContext pc, ExtensionContext ec) {\n    return \"42\"; // String for an int parameter\n}\n// after\n@Override public Object resolveParameter(ParameterContext pc, ExtensionContext ec) {\n    return Integer.parseInt(\"42\");\n}","handlingStrategy":"type-guard","validationCode":"Object value = resolver.resolveParameter(pc, ec);\nClass<?> t = pc.getParameter().getType();\nif (!t.isPrimitive() && value != null && !t.isInstance(value)) {\n    throw new IllegalStateException(\"Resolver returned \" + value.getClass() + \" for \" + t);\n}\nif (t.isPrimitive() && value == null) {\n    throw new IllegalStateException(\"null returned for primitive \" + t);\n}","typeGuard":"Object v = resolver.resolveParameter(pc, ec);\nClass<?> t = pc.getParameter().getType();\nboolean ok = (t.isPrimitive()) ? v != null && isAssignableTo(v, t) : (v == null || t.isInstance(v));\nif (!ok) throw new IllegalStateException(\"type mismatch for \" + t);","tryCatchPattern":null,"preventionTips":["Branch on pc.getParameter().getType() inside resolveParameter and return the matching type.","Never return null for primitive parameters - resolve to a real value.","For optional values, use the boxed wrapper type as the parameter."],"tags":["parameter-resolution","type-mismatch","parameter-resolver","primitive"],"backgroundTag":null,"analyzedSha":"f070c699a08b5d8393df9afd147af5c5e90bb21b","analyzedAt":"2026-08-11T20:31:00.530Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}