Description
Overview
I have found that it would be useful if you could use argument fields as a part of parametrized test name. Right now, when using just {0}
as described in docs, it results in injecting into a test name string in form of ClassName(fieldName1=fieldValue1, fieldName2=fieldValue2, ...)
. But that doesn't seen readable at all especially then you have a class with more than just few fields. Now I would like to be able to use some semantics as {0.name}
or {0}.name
to use just name field of class used as test method argument, so I can write test name as follows:
@BeerTest
class BeerConversionServiceTest {
@Autowired
private BeerConversionService beerConversionService;
private static Stream<Arguments> createBeers() {
return Stream.of(
Arguments.of(new Beer(...), 25L),
Arguments.of(new Beer(...), 50L)
);
}
@DisplayName("Get alcohol content of a beer in mg")
@ParameterizedTest(name = "Alcohol content of {0.name} should be equal to {1}")
@MethodSource("createBeers")
void getAlcInMg(Beer beer, long mg) {
Assertions.assertEquals(beerConversionService.getAlcInMg(beer), mg);
}
}
This would give users possibility to keep test names simple, yet still descriptive, as they could reference objects passed as arguments and use only parts of them which identifies test cases.
I didn't look into the source code so I cannot tell which approach would be easier to implement but I would guess that {0.name}
seems more reasonable.
Deliverables
- Introduce an SPI (similar to what has been proposed above) and provide a SpEL-based and/or OGNL-based implementation.
- Ensure that display names for
@ParameterizedTest
and@RepeatedTest
can make use of the same facility (see @ParameterizedTest display custom names for arguments #2452).