junit-team/junit5 · error · ParameterResolutionException
ParameterResolver [%s] resolved a null value for parameter [
Error message
ParameterResolver [%s] resolved a null value for parameter [%s] in %s [%s], but a primitive of type [%s] is required.
What it means
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.
Source
Thrown at junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java:201
// Note: null is permissible as a resolved value but only for non-primitive types.
if (!isAssignableTo(value, type)) {
String message;
if (value == null && type.isPrimitive()) {
message = """
ParameterResolver [%s] resolved a null value for parameter [%s] \
in %s [%s], but a primitive of type [%s] is required.""".formatted(
resolver.getClass().getName(), parameter, asLabel(executable), executable.toGenericString(),
type.getName());
}
else {
message = """
ParameterResolver [%s] resolved a value of type [%s] for parameter [%s] \
in %s [%s], but a value assignment compatible with [%s] is required.""".formatted(
resolver.getClass().getName(), (value != null ? value.getClass().getTypeName() : null), parameter,
asLabel(executable), executable.toGenericString(), type.getTypeName());
}
throw new ParameterResolutionException(message);
}
}
private static String asLabel(Executable executable) {
return executable instanceof Constructor ? "constructor" : "method";
}
private ParameterResolutionUtils() {
}
}
View on GitHub (pinned to 956246301e)
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.
Example fix
// before
@ParameterizedTest
@NullSource
void test(int value) { ... } // null cannot be assigned to int
// after
@ParameterizedTest
@NullSource
void test(Integer value) { ... } // boxed type accepts null Defensive patterns
Strategy: type-guard
Validate before calling
// Reject @NullSource-style sources for primitive parameters before running
if (parameter.getType().isPrimitive() && sourceProvidesNull(annotation)) {
throw new IllegalStateException("Cannot provide null to primitive " + parameter);
} Type guard
static boolean acceptsNull(Parameter p) {
return !p.getType().isPrimitive(); // boxed types accept null
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- ParameterResolver [%s] resolved a value of type [%s] for par
- TestInstanceFactory [%s] failed to return an instance of [%s
- No ParameterResolver registered for parameter [%s] in %s [%s
- Discovered multiple competing ParameterResolvers for paramet
- Failed to resolve parameter [%s] in %s [%s]
AI-assisted analysis of junit-team/junit5@956246301e (2026-08-04).
Data as JSON: /data/errors/ffd66cc15b907f81.json.
Report an issue: GitHub.