Java JUnit5测试模板和扩展:访问TestTemplateInvocationContext?

Java JUnit5测试模板和扩展:访问TestTemplateInvocationContext?,java,junit5,Java,Junit5,用例: 应使用不同的参数进行试验 对于这个测试,我们希望使用一个扩展来进行一些预/后处理。此步骤需要访问当前设置的参数 最初,我尝试用@parameteredTest实现这一点。在这里,扩展没有机会访问该参数(该参数是在调用beforeTestExecution之后计算的)。因此,我将@TemplateTest与TestTemplateInvocationContextProvider一起使用(如中所述)。现在我可以在extensionContext中看到我的参数。不幸的是,缺少访问器方法:

用例:

  • 应使用不同的参数进行试验
  • 对于这个测试,我们希望使用一个扩展来进行一些预/后处理。此步骤需要访问当前设置的参数
最初,我尝试用
@parameteredTest
实现这一点。在这里,扩展没有机会访问该参数(该参数是在调用
beforeTestExecution
之后计算的)。因此,我将
@TemplateTest
TestTemplateInvocationContextProvider
一起使用(如中所述)。现在我可以在
extensionContext
中看到我的参数。不幸的是,缺少访问器方法:

  • MethodExtensionContext
    (响应超类):
    getTestDescriptor():TestTemplateInvocationTestDescriptor
  • TestTemplateInvocationTestDescriptor
    getInvocationContext()
作为一个临时的解决方法,我做了一些反射来访问我的
调用上下文

有什么东西反对引入这些访问器方法吗?有更好/更简单的方法吗?

我认为您可以在
TestTemplateInvocationContext
中提供额外的扩展。以下内容基于《用户指南》中的示例:

@TestTemplate
@ExtendWith(MyTestTemplateInvocationContextProvider.class)
void testTemplate(String parameter) {
    System.out.println("Test with parameter: " + parameter);
    assertEquals(3, parameter.length());
}

static class MyTestTemplateInvocationContextProvider implements TestTemplateInvocationContextProvider {
    @Override
    public boolean supportsTestTemplate(ExtensionContext context) {
        return true;
    }

    @Override
    public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(ExtensionContext context) {
        return Stream.of(invocationContext("foo"), invocationContext("bar"));
    }

    private TestTemplateInvocationContext invocationContext(String parameter) {
        return new TestTemplateInvocationContext() {
            @Override
            public String getDisplayName(int invocationIndex) {
                return parameter;
            }

            @Override
            public List<Extension> getAdditionalExtensions() {
                return Arrays.asList(parameterResolver(), preProcessor(), postProcessor());
            }

            private BeforeTestExecutionCallback preProcessor() {
                return new BeforeTestExecutionCallback() {

                    @Override
                    public void beforeTestExecution(ExtensionContext context) throws Exception {
                        System.out.println("Pre-process parameter: " + parameter);
                    }
                };
            }

            private AfterTestExecutionCallback postProcessor() {
                return new AfterTestExecutionCallback() {

                    @Override
                    public void afterTestExecution(ExtensionContext context) throws Exception {
                        System.out.println("Post-process parameter: " + parameter);
                    }

               };
            }

            private ParameterResolver parameterResolver() {
                return new ParameterResolver() {
                    @Override
                    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) {
                        return parameterContext.getParameter()
                                .getType()
                                .equals(String.class);
                    }

                    @Override
                    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) {
                        return parameter;
                    }
                };
            }
        };
    }
}

这意味着我必须从一个扩展到另一个扩展。目前我有两个扩展:一个(
MyProvider
)实现
TestTemplateInvocationContextProvider
(用于测试参数化)和一个(
MyCallback
)实现
BeforeTestExecutionCallback
,用于做一些准备工作

这看起来像:

  @ExtendWith(MyCallback.class)
  public class WebTest {
    @TestTemplate
    @ExtendWith(MyProvider.class)
    public void showPage() throws Exception {
    }
  }
我的目标是在类级扩展中获取当前参数:

  public class MyCallback implements BeforeAllCallback, BeforeTestExecutionCallback {
  public void beforeAll(ExtensionContext ctx) {
  }
  public void beforeTestExecution(ExtensionContext ctx) {
    // HERE I WANT CURRENT PARAMETER VALUE:
    ((TestTemplateInvocationTestDescriptor) ((MethodExtensionContext) ctx).testDescriptor).invocationContext;
  }

如果我添加了两个公共方法(如第一次编辑中所述),这是可能的,但可能是违背了这个概念?

我现在将回调拆分,并将
BeforeTestExecutionCallback
部分移动到一个新的扩展中,我将其添加到
getAdditionalExtensions
(如建议的)中。