{"id":"ffd66cc15b907f81","repo":"junit-team/junit5","slug":"parameterresolver-s-resolved-a-null-value-for-p","errorCode":null,"errorMessage":"ParameterResolver [%s] resolved a null value for parameter [%s] in %s [%s], but a primitive of type [%s] is required.","messagePattern":"ParameterResolver \\[(.+?)\\] resolved a null value for parameter \\[(.+?)\\] in (.+?) \\[(.+?)\\], but a primitive of type \\[(.+?)\\] 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/956246301e03d757539f7b76dd5a91f298637563/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java#L183-L213","documentation":"Thrown by ParameterResolutionUtils.validateResolvedType() when a ParameterResolver returns null for a parameter whose declared type is a primitive (int, boolean, etc.). Primitives cannot hold null, so the engine rejects the resolved value as a ParameterResolutionException naming the resolver, parameter, executable, and required primitive type.","triggerScenarios":"A ParameterResolver.resolveParameter() returns null while the target parameter is a primitive (e.g. int, long, boolean). This can also occur with built-in argument sources (e.g. @ValueSource) that supply null to a primitive parameter, or a custom resolver that returns null as a 'no value' sentinel.","commonSituations":"Using @NullSource or @NullAndEmptySource with a primitive parameter (primitives cannot be null); a custom resolver that returns null when an external lookup misses, paired with a primitive parameter; CSV-argument conversion yielding an empty string parsed to null for a primitive.","solutions":["Change the parameter type from primitive to its boxed wrapper (int -> Integer) so null is legal, or","Ensure the resolver/argument source provides a non-null value for primitive parameters.","Remove @NullSource/@NullAndEmptySource from the parameterized test if the parameter is primitive, or wrap it."],"exampleFix":"// before\n@ParameterizedTest\n@NullSource\nvoid test(int value) { ... } // null cannot be assigned to int\n\n// after\n@ParameterizedTest\n@NullSource\nvoid test(Integer value) { ... } // boxed type accepts null","handlingStrategy":"type-guard","validationCode":"// Reject @NullSource-style sources for primitive parameters before running\nif (parameter.getType().isPrimitive() && sourceProvidesNull(annotation)) {\n    throw new IllegalStateException(\"Cannot provide null to primitive \" + parameter);\n}","typeGuard":"static boolean acceptsNull(Parameter p) {\n    return !p.getType().isPrimitive(); // boxed types accept null\n}","tryCatchPattern":null,"preventionTips":["Use the boxed wrapper type (Integer/Long/Boolean) when null is a valid test input.","Never apply @NullSource/@NullAndEmptySource to a primitive parameter.","Ensure custom resolvers never return null for primitive parameters."],"tags":["junit-jupiter","parameter-resolution","primitive","null","type-mismatch"],"analyzedSha":"956246301e03d757539f7b76dd5a91f298637563","analyzedAt":"2026-08-04T19:25:17.049Z","schemaVersion":2}