junit-team/junit5 · error · ExtensionConfigurationException
When the display name pattern for a @
Error message
When the display name pattern for a @%s contains %s, the arguments must be supplied as an ArgumentSet.
What it means
Thrown by the ArgumentSetNameFormatter when the display name pattern contains the ArgumentSet name placeholder (referenced as the placeholder for named argument sets) but the actual arguments for the current invocation were not supplied as an ArgumentSet (which carries a name). Plain Arguments, Object[], or unnamed sources don't have a name, so the placeholder has nothing to render.
Solutions
- Wrap your arguments in ArgumentSet.named("my name", arg1, arg2) when using the {arguments-set-name} placeholder
- If using @MethodSource, return Stream<ArgumentSet> instead of Stream<Arguments>
- Remove the ArgumentSet name placeholder from the display name pattern if you don't need named argument sets
Example fix
// before — placeholder used but no named sets provided
@ParameterizedTest(name = "{arguments-set-name}: {0}")
@MethodSource("data")
void test(String input) { }
static Stream<Arguments> data() {
return Stream.of(
Arguments.of("valid"),
Arguments.of("invalid")
);
}
// after — use ArgumentSet.named(...)
static Stream<ArgumentSet> data() {
return Stream.of(
ArgumentSet.named("valid input", "valid"),
ArgumentSet.named("invalid input", "invalid")
);
} Defensive patterns
Strategy: validation
Validate before calling
// Check if the display name pattern requires ArgumentSet names and validate the source accordingly
import org.junit.jupiter.params.ParameterizedTest;
import java.lang.reflect.AnnotatedElement;
static boolean patternNeedsArgumentSetName(String pattern) {
return pattern.contains("{arguments-set-name}");
}
// If the pattern needs names, ensure the source returns ArgumentSet.named(...):
static java.util.stream.Stream<Arguments> dataWithNames() {
return java.util.stream.Stream.of(
org.junit.jupiter.params.provider.ArgumentSet.named("valid", "input1"),
org.junit.jupiter.params.provider.ArgumentSet.named("invalid", "input2")
);
} Prevention
- Only use {arguments-set-name} in the display name pattern if all argument sources return ArgumentSet.named(...) values
- For mixed sources, remove the {arguments-set-name} placeholder or split the test into named and unnamed variants
When it happens
Trigger: Use @ParameterizedTest(name = "{arguments-set-name}") or a pattern containing the ArgumentSet name placeholder, but provide arguments via @ValueSource, @CsvSource, @MethodSource returning plain Arguments, or any source that doesn't wrap arguments in ArgumentSet.named(...).
Common situations: Developers who want named test invocations for readability (e.g., 'test with valid user', 'test with admin user') and set up the display name pattern before switching their source to ArgumentSet.named(). Or mixing named and unnamed argument sources in the same test.
Related errors
- The display name pattern defined for the parameterized test…
- Configuration error: .
- Configuration error: You must configure at least one set of…
- Constructor injection is not supported for…
- configuration errors:%n
AI-assisted analysis of junit-team/junit5@f070c699a0 (2026-08-11).
Data as JSON: /api/errors/0f90e2c061d579e9.
Report an issue: GitHub.
Appendix: source
Thrown at junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationNameFormatter.java:231
@FunctionalInterface
private interface PartialFormatter {
PartialFormatter INDEX = (context, result) -> result.append(context.invocationIndex);
void append(ArgumentsContext context, StringBuffer result);
}
private record ArgumentSetNameFormatter(String annotationName) implements PartialFormatter {
@Override
public void append(ArgumentsContext context, StringBuffer result) {
if (context.argumentSetName != null) {
result.append(context.argumentSetName);
return;
}
throw new ExtensionConfigurationException(
"When the display name pattern for a @%s contains %s, the arguments must be supplied as an ArgumentSet.".formatted(
this.annotationName, ARGUMENT_SET_NAME_PLACEHOLDER));
}
}
private static class MessageFormatPartialFormatter implements PartialFormatter {
@SuppressWarnings("UnnecessaryUnicodeEscape")
private static final char ELLIPSIS = '\u2026';
private final MessageFormat messageFormat;
private final int argumentMaxLength;
private final boolean generateNameValuePairs;
private final @Nullable ResolverFacade resolverFacade;
MessageFormatPartialFormatter(String pattern, int argumentMaxLength) {
this(pattern, argumentMaxLength, false, null);
}View on GitHub (pinned to f070c699a0)