Как получить доступ к аннотациям метода теста из 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)