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

  1. Change the parameter type from primitive to its boxed wrapper (int -> Integer) so null is legal, or
  2. Ensure the resolver/argument source provides a non-null value for primitive parameters.
  3. 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

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


AI-assisted analysis of junit-team/junit5@956246301e (2026-08-04). Data as JSON: /data/errors/ffd66cc15b907f81.json. Report an issue: GitHub.