{"record":{"id":"0f90e2c061d579e9","repo":"junit-team/junit5","slug":"when-the-display-name-pattern-for-a-s-contains","errorCode":null,"errorMessage":"When the display name pattern for a @%s contains %s, the arguments must be supplied as an ArgumentSet.","messagePattern":"When the display name pattern for a @(.+?) contains (.+?), the arguments must be supplied as an ArgumentSet\\.","errorType":"exception","errorClass":"ExtensionConfigurationException","httpStatus":null,"severity":"error","filePath":"junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationNameFormatter.java","lineNumber":231,"sourceCode":"\n\t@FunctionalInterface\n\tprivate interface PartialFormatter {\n\n\t\tPartialFormatter INDEX = (context, result) -> result.append(context.invocationIndex);\n\n\t\tvoid append(ArgumentsContext context, StringBuffer result);\n\n\t}\n\n\tprivate record ArgumentSetNameFormatter(String annotationName) implements PartialFormatter {\n\n\t\t@Override\n\t\tpublic void append(ArgumentsContext context, StringBuffer result) {\n\t\t\tif (context.argumentSetName != null) {\n\t\t\t\tresult.append(context.argumentSetName);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow new ExtensionConfigurationException(\n\t\t\t\t\"When the display name pattern for a @%s contains %s, the arguments must be supplied as an ArgumentSet.\".formatted(\n\t\t\t\t\tthis.annotationName, ARGUMENT_SET_NAME_PLACEHOLDER));\n\t\t}\n\t}\n\n\tprivate static class MessageFormatPartialFormatter implements PartialFormatter {\n\n\t\t@SuppressWarnings(\"UnnecessaryUnicodeEscape\")\n\t\tprivate static final char ELLIPSIS = '\\u2026';\n\n\t\tprivate final MessageFormat messageFormat;\n\t\tprivate final int argumentMaxLength;\n\t\tprivate final boolean generateNameValuePairs;\n\t\tprivate final @Nullable ResolverFacade resolverFacade;\n\n\t\tMessageFormatPartialFormatter(String pattern, int argumentMaxLength) {\n\t\t\tthis(pattern, argumentMaxLength, false, null);\n\t\t}","sourceCodeStart":213,"sourceCodeEnd":249,"githubUrl":"https://github.com/junit-team/junit5/blob/f070c699a08b5d8393df9afd147af5c5e90bb21b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationNameFormatter.java#L213-L249","documentation":"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.","triggerScenarios":"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(...).","commonSituations":"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.","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"],"exampleFix":"// before — placeholder used but no named sets provided\n@ParameterizedTest(name = \"{arguments-set-name}: {0}\")\n@MethodSource(\"data\")\nvoid test(String input) { }\n\nstatic Stream<Arguments> data() {\n    return Stream.of(\n        Arguments.of(\"valid\"),\n        Arguments.of(\"invalid\")\n    );\n}\n\n// after — use ArgumentSet.named(...)\nstatic Stream<ArgumentSet> data() {\n    return Stream.of(\n        ArgumentSet.named(\"valid input\", \"valid\"),\n        ArgumentSet.named(\"invalid input\", \"invalid\")\n    );\n}","handlingStrategy":"validation","validationCode":"// Check if the display name pattern requires ArgumentSet names and validate the source accordingly\nimport org.junit.jupiter.params.ParameterizedTest;\nimport java.lang.reflect.AnnotatedElement;\n\nstatic boolean patternNeedsArgumentSetName(String pattern) {\n    return pattern.contains(\"{arguments-set-name}\");\n}\n\n// If the pattern needs names, ensure the source returns ArgumentSet.named(...):\nstatic java.util.stream.Stream<Arguments> dataWithNames() {\n    return java.util.stream.Stream.of(\n        org.junit.jupiter.params.provider.ArgumentSet.named(\"valid\", \"input1\"),\n        org.junit.jupiter.params.provider.ArgumentSet.named(\"invalid\", \"input2\")\n    );\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["display-name","argument-set","named-arguments","configuration","junit-params"],"backgroundTag":null,"analyzedSha":"f070c699a08b5d8393df9afd147af5c5e90bb21b","analyzedAt":"2026-08-11T20:31:00.530Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}