public record MyTestData(String name, Integer age) {}
static class MyTestDataValues implements SourceOf<MyTestData> {
public List<MyTestData> values() {
return List.of(
new MyTestData("foo", 5),
new MyTestData("bar", 10)
);
}
}
@ParameterizedTest(name="{0} - {1}")
@ArgumentsSource(MyTestDataValues.class)
public void exampleTest(String name, Integer age) {
System.out.println(name + " " + age);
assertEquals(0, age % 5);
assertEquals(3, name.length());
}
public interface SourceOf<T extends Record> extends ArgumentsProvider {
List<T> values();
default Stream<? extends Arguments> provideArguments(ExtensionContext context) {
return values().stream().map(
v -> Arrays.stream(v.getClass().getRecordComponents())
.map(rc -> {
try {
return rc.getAccessor().invoke(v);
} catch (Exception e) {
throw new RuntimeException(e);
}
})
.toArray()
).map(Arguments::of);
}
}
I like parameterised tests but find #junit 's EnumSource/MethodSource etc dissatisfying.
Here's how you can parameterize tests with #java records
gist.github.com/benjiman/e9f...