Add parameterized module: JUnit 5 @ParameterizedTest argument sources, display names, and two real anti-pattern failures
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
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.<init>(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.
|
||||
Reference in New Issue
Block a user