Зарегистрируйте расширения автоматически в JUnit - PullRequest
0 голосов
/ 22 января 2020

Я расширяю JUnit ParameterResolver для предоставления настраиваемого аргумента в методах тестирования.

 public class MyParameterResolver implements ParameterResolver {

    @Override
    public boolean supportsParameter(ParameterContext parameterContext,
            ExtensionContext extensionContext) throws ParameterResolutionException {
        return parameterContext.getParameter().getType() == MyWrapper.class;
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext,
            ExtensionContext extensionContext) throws ParameterResolutionException {

        // Do something about getting MyAnnotation

        return new MyWrapper();
    }

}

и затем использую его в методах тестирования, используя ExtendWith

@ExtendWith(MyParameterResolver.class)
@Test
@MyAnnotation(val = 20)
@MyAnnotation(val = 30)    
void test(MyWrapper wrapper) {
    System.out.println(wrapper);
}

Это прекрасно работает, однако мне не нравится идея, что все тесты, которым требуется это расширение, должны быть аннотированы @ExtendWith(MyParameterResolver.class), возможно ли автоматически регистрировать аннотацию в Junit программно, когда метод теста содержит MyWrapper параметр или MyAnnotation аннотация?

1 Ответ

1 голос
/ 22 января 2020

§5.2 Руководство пользователя JUnit 5 показывает три способа регистрации расширений:

  1. Декларативно с помощью @ExtendWith ( §5.2.1 ).

    Разработчики могут зарегистрировать одно или несколько расширений декларативно путем аннотирования интерфейса тестирования, класса тестирования, метода тестирования или пользовательского составная аннотация с @ExtendWith(…​) и предоставление ссылок на классы для регистрируемых расширений.

    Примечание: Если вы аннотируете класс с помощью @ExtendWith(...), то все вложенные методы тестирования будут расширены указанным расширением.

  2. Программно с помощью @RegisterExtension ( § 5.2.2 ).

    Разработчики могут регистрировать расширения программно , отмечая поля в тестовых классах с помощью @RegisterExtension.

    Когда расширение зарегистрировано декларативно через @ExtendWith, его обычно можно настроить только с помощью аннотаций. Напротив, когда расширение зарегистрировано через @RegisterExtension, оно может быть настроено программно - например, для передачи аргументов в конструктор расширения, фабричный метод stati c или API построителя. .

  3. Автоматически через 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) быстрая, то регистрация расширения для методов, которые его не используют, не должна быть проблемой. Другими словами, это существенно не замедлит ваши тесты или, насколько я знаю, приведет к ошибкам.

...