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
(如建议的)中。