Как получить доступ к аннотациям метода теста из TestExecutionListener

Я пытаюсь перенести управление тестированием для интеграции Jira JUnit в JUnit5. Этот модуль генерирует отчет JSON о выполнении теста и связывает результаты с билетами Jira, используя, например, аннотации к методам тестирования.

Из TestExecutionListener я не уверен, что лучший подход для извлечения аннотации TestCase.

Я посмотрел на Reflection с помощью TestIdentifier.getSource и провел манипуляции, чтобы перестроить сигнатуру метода и извлечь аннотацию оттуда, но подход был неуклюжим.

Я наткнулся на этот пост Разрешить расширениям регистрировать TestExecutionListeners, который предложил следующее:

Предложение: пусть ваше расширение публикует идентификатор сеанса компонента WebDriver, например

String sessionId = ...;
extensionContext.publishReportEntry("webDriverSessionId", sessionId)

В вашем TestExecutionListener реализуйте reportEntryPublished и сохраните его на карте с ключом TestIdentifier. В исполнении Законченный отчет о результатах теста вместе со значением из этой карты.

Этот подход выглядит многообещающим, но я хочу убедиться, что нет другого способа, который не требует и расширения, и прослушивателя выполнения теста. Есть ли способ получить информацию аннотации метода тестирования непосредственно в TestExecutionListener?

2 ответа

Похоже, вы не можете получить тестовую аннотацию из TestExecutionListener но вместо этого вы можете реализовать TestWatcher или например AfterEachCallback и получите такое значение аннотации:

      import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestWatcher;

public class MyExtention implements TestWatcher, AfterEachCallback {


    @Override public void testSuccessful(ExtensionContext context) {
        if (context.getElement().isPresent() && context.getElement().get().isAnnotationPresent(MyCustomAnnotation.class)) {
            int val = context.getElement().get().getAnnotation(MyCustomAnnotation.class).value();
            // Report on success
        }
    }

    @Override public void afterEach(ExtensionContext context) throws Exception {
        if (context.getElement().isPresent() && context.getElement().get().isAnnotationPresent(MyCustomAnnotation.class)) {
            int val = context.getElement().get().getAnnotation(MyCustomAnnotation.class).value();
            // Report each
        }
    }
}

@Alex, внутри слушателя может использоваться следующее ...((MethodSource) testIdentifier.source).javaMethod.getAnnotation(TestCase.class)

Другие вопросы по тегам