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

  1. Wrap your arguments in ArgumentSet.named("my name", arg1, arg2) when using the {arguments-set-name} placeholder
  2. If using @MethodSource, return Stream<ArgumentSet> instead of Stream<Arguments>
  3. 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

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


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)