Captured from a real `mvn test -Dtest=HeaderNamePlaceholderMistakeTest` run with the @Disabled annotation temporarily removed -- i.e. exactly name = "user {USER_ID} with role {ROLE}" on a real @CsvSource(useHeadersInDisplayName = true) test, run for real. ------------------------------------------------------------------------------- Test set: com.ankurm.tutorials.junit.parameterized.HeaderNamePlaceholderMistakeTest ------------------------------------------------------------------------------- Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.050 s <<< FAILURE! -- in com.ankurm.tutorials.junit.parameterized.HeaderNamePlaceholderMistakeTest com.ankurm.tutorials.junit.parameterized.HeaderNamePlaceholderMistakeTest.nameTemplateCannotReferenceHeadersByName(int, String, boolean) -- Time elapsed: 0.034 s <<< ERROR! org.junit.platform.commons.JUnitException: The display name pattern defined for the parameterized test is invalid. See nested exception for further details. at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) Caused by: java.lang.IllegalArgumentException: can't parse argument number: USER_ID at java.base/java.text.MessageFormat.setFormatFromPattern(MessageFormat.java:1644) at java.base/java.text.MessageFormat.applyPatternImpl(MessageFormat.java:660) at java.base/java.text.MessageFormat.(MessageFormat.java:516) ... 2 more Caused by: java.lang.NumberFormatException: For input string: "USER_ID" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) at java.base/java.lang.Integer.parseInt(Integer.java:565) at java.base/java.lang.Integer.parseInt(Integer.java:662) at java.base/java.text.MessageFormat.setFormatFromPattern(MessageFormat.java:1642) ... 4 more The stack trace gives away the mechanism: @ParameterizedTest's `name` attribute is not its own template language -- it compiles down to a real java.text.MessageFormat pattern, and MessageFormat only understands numeric argument indices ({0}, {1}, ...). "USER_ID" is not a number, so MessageFormat's own pattern parser throws NumberFormatException trying to read it as one, before the test ever runs a single invocation. useHeadersInDisplayName = true changes what JUnit generates automatically when no custom name is given (see docs/output/05-csv-source-headers-default-display-name.txt) -- it does not add a new kind of placeholder you can reference yourself.