§5.2 Руководство пользователя JUnit 5 показывает три способа регистрации расширений:
Декларативно с помощью @ExtendWith
( §5.2.1 ).
Разработчики могут зарегистрировать одно или несколько расширений декларативно путем аннотирования интерфейса тестирования, класса тестирования, метода тестирования или пользовательского составная аннотация с @ExtendWith(…)
и предоставление ссылок на классы для регистрируемых расширений.
Примечание: Если вы аннотируете класс с помощью @ExtendWith(...)
, то все вложенные методы тестирования будут расширены указанным расширением.
Программно с помощью @RegisterExtension
( § 5.2.2 ).
Разработчики могут регистрировать расширения программно , отмечая поля в тестовых классах с помощью @RegisterExtension
.
Когда расширение зарегистрировано декларативно через @ExtendWith
, его обычно можно настроить только с помощью аннотаций. Напротив, когда расширение зарегистрировано через @RegisterExtension
, оно может быть настроено программно - например, для передачи аргументов в конструктор расширения, фабричный метод stati c или API построителя. .
Автоматически через java.util.ServiceLoader
( §5.2.3 ).
В дополнение к декларативной регистрации расширения и Programmati c поддержка регистрации расширений с использованием аннотаций, JUnit Jupiter также поддерживает глобальную регистрацию расширений с помощью механизма Java java.util.ServiceLoader
, что позволяет автоматически обнаруживать и автоматически регистрировать сторонние расширения на основе того, что доступно в classpath.
В частности, пользовательское расширение можно зарегистрировать, указав его полное имя класса в файле с именем org.junit.jupiter.api.extension.Extension
в папке /META-INF/services
в прилагаемом файле JAR.
Примечание: Automati c регистрация должна быть явно включена .
Если у вас все в порядке с расширением, зарегистрированным глобально, то вы можете использовать автоматический механизм регистрации c. Но, похоже, нет способа расширить методы тестирования, только если они имеют определенный тип параметра c. Однако вы можете создать так называемую составную аннотацию , чтобы упростить задачу:
@ExtendWith(MyParameterResolver.class)
@Retention(RUNTIME)
@Target(METHOD)
public @interface ComposedAnnotation {
int[] vals(); // int array to (maybe?) replace the multiple @MyAnnotation(val = XXX) annotations
}
Хотя я не знаю, совместимо ли это с вашей аннотацией @MyAnnotation
.
Обратите внимание, что если ваша реализация #supportsParameter(ParameterContext,ExtensionContext)
быстрая, то регистрация расширения для методов, которые его не используют, не должна быть проблемой. Другими словами, это существенно не замедлит ваши тесты или, насколько я знаю, приведет к ошибкам.