Junit5 如何从TestExecutionListener访问测试方法注释

Junit5 如何从TestExecutionListener访问测试方法注释,junit5,junit5-extension-model,Junit5,Junit5 Extension Model,我正在尝试移植到JUnit5。此模块生成测试运行的JSON报告,并使用测试方法上的注释将结果与Jira票据关联 从TestExecutionListener中,我不确定检索TestCase注释的最佳方法是什么 我使用TestIdentifier.getSource查看反射,并进行操作以重建方法签名并从中提取注释,但这种方法感觉很笨拙 我遇到了这篇文章,它提出了以下建议: 建议:让您的扩展发布WebDriver bean的会话id,例如 在TestExecutionListener中,实现repo

我正在尝试移植到JUnit5。此模块生成测试运行的JSON报告,并使用测试方法上的注释将结果与Jira票据关联

从TestExecutionListener中,我不确定检索TestCase注释的最佳方法是什么

我使用TestIdentifier.getSource查看反射,并进行操作以重建方法签名并从中提取注释,但这种方法感觉很笨拙

我遇到了这篇文章,它提出了以下建议:

建议:让您的扩展发布WebDriver bean的会话id,例如

在TestExecutionListener中,实现reportingEntryPublished并将其存储在地图中,并使用TestIdentifier作为键。在executionFinished中,报告测试结果以及此映射中的值


这种方法看起来很有希望,但我想确保没有另一种方法不需要扩展和测试执行侦听器。有没有一种方法可以直接在TestExecutionListener中检索测试方法注释信息?

@Alex,以下内容可能会在侦听器中使用。。。
((MethodSource)testIdentifier.source).javaMethod.getAnnotation(TestCase.class)

@Alex,以下内容可能在侦听器中使用。。。
((MethodSource)testIdentifier.source).javaMethod.getAnnotation(TestCase.class)

似乎您无法从
TestExecutionListener
获取测试注释,但您可以实现
TestWatcher
或在每次回调后
获取自定义注释值,如下所示:

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
        }
    }
}


似乎您无法从
TestExecutionListener
获取测试注释,但您可以实现
TestWatcher
或例如
在每次回调后
获取自定义注释值,如下所示:

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
        }
    }
}


如果您没有实现
TestExecutionListener
的具体需求,那么您可以为JUnit Jupiter实现
TestWatcher
扩展API,并通过自定义注释(即,使用
@ExtendWith(MyExtension.class)进行元注释)注册该扩展
或通过全局注册机制。在自定义的
TestWatcher
扩展中,您可以通过
ExtensionContext
访问当前的测试方法,然后在该方法上查找注释。@SamBrannen我有一个使用上述方法的工作解决方案,我确实需要TestExecutionListener编写在testPlanExecutionFinished上创建要文件的报告。我只需要扩展名来捕获与我的批注关联的值。我现在尝试扩展该扩展名以支持ParameterizeTest。我试图从参数中获取值,但遇到了。我现在尝试使用TestReporter在测试定义中发布TestCaseKey。听起来像e您走对了!访问
@parameteredtest
的参数(
java.lang.reflect.Parameter
)应该不会有任何问题。该参数应与任何方法(
@Test
等)的工作原理相同。或者您真的需要访问传递给该方法的物理运行时参数吗?@SamBrannen对我的响应延迟表示抱歉,我感谢您花时间。我创建了此文件,它演示了我希望完成的任务,以及我的不足之处。如果您没有具体需要实现
TestExecutionListener
,您可以n为JUnit Jupiter实现
TestWatcher
扩展API,并通过自定义注释(即,使用
@ExtendWith(MyExtension.class)进行元注释)注册该扩展
或通过全局注册机制。在自定义的
TestWatcher
扩展中,您可以通过
ExtensionContext
访问当前的测试方法,然后在该方法上查找注释。@SamBrannen我有一个使用上述方法的工作解决方案,我确实需要TestExecutionListener编写在testPlanExecutionFinished上创建要文件的报告。我只需要扩展名来捕获与我的批注关联的值。我现在尝试扩展该扩展名以支持ParameterizeTest。我试图从参数中获取值,但遇到了。我现在尝试使用TestReporter在测试定义中发布TestCaseKey。听起来像e您走对了!访问
@parameteredtest
的参数(
java.lang.reflect.Parameter
)应该不会有任何问题。该参数应与任何方法(
@Test
等)的工作原理相同。或者您真的需要访问传递给该方法的物理运行时参数吗?@SamBrannen很抱歉我的响应出现延迟,我感谢您花时间。我创建了此文件,它展示了我希望实现的目标以及我的不足之处。