Хорошо, это будет странный ответ, но он работает, и это было довольно весело.
Первое: твой путь невозможен. Не из-за JUnit или любого связанного API, а из-за Java - действительные элементы типа аннотации (аргументы аннотации могут быть только примитивными, String, Class, Enum, другими аннотациями и массивом всего этого).
Второе: мы можем обойти первое. Проверь это:
@ArraySources(
arrays = {
@ArraySource(array = {1, 2, 3}),
@ArraySource(array = {4, 5, 6}),
@ArraySource(array = {7, 8, 9})
}
)
Как говорится, аннотация может иметь другие аннотации в качестве аргументов и их массивы, поэтому мы используем здесь эти 2 правила.
Третье: как это поможет? Мы можем добавить нашего собственного поставщика аннотаций + аргументов, JUnit 5 расширяется таким образом.
Обе аннотации:
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ArgumentsSource(ArrayArgumentsProvider.class)
public @interface ArraySources {
ArraySource[] arrays();
}
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ArraySource {
int[] array() default {};
}
Поставщик аргументов на основе аннотаций:
public class ArrayArgumentsProvider implements ArgumentsProvider, AnnotationConsumer<ArraySources> {
private List<int[]> arguments;
public void accept(ArraySources source) {
List<ArraySource> arrays = Arrays.asList(source.arrays());
this.arguments = arrays.stream().map(ArraySource::array).collect(Collectors.toList());
}
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
return this.arguments.stream().map(Arguments::of);
}
}
И последний тест с использованием тех:
public class ArraySourcesTest {
@ParameterizedTest
@ArraySources(
arrays = {
@ArraySource(array = {1, 2, 3}),
@ArraySource(array = {4, 5, 6}),
@ArraySource(array = {7, 8, 9})
}
)
void example(int[] array) {
System.out.println(Arrays.toString(array));
System.out.println("Test Over");
}
}
/* Output
[1, 2, 3]
Test Over
[4, 5, 6]
Test Over
[7, 8, 9]
Test Over
*/
Вы упомянули @MethodSource
как сложный, ну так я думаю я не справился в этом вопросе, но он работает. Очевидно, его можно было бы упростить и улучшить (например, назвать аргументы аннотации как значения по умолчанию — значение — и я сделал это только для int
, чтобы показать идею). Не уверен, что вы могли бы добиться того же с существующими функциями (ArgumentsProvider
и ArgumentSources
), но это выглядит более конкретно (вы знаете, что работаете с массивами) и показывает возможности расширения JUnit5, может быть полезно в другом случае.
person
Shadov
schedule
02.08.2018