,可以通过编写自定义的扩展来实现。
首先,需要创建一个实现BeforeEachCallback
和AfterEachCallback
接口的类,该类将负责在每个测试方法之前和之后执行相应的操作。在这个类中,可以定义一个成员变量来存储参数化的值。
接下来,需要创建一个实现TestTemplateInvocationContextProvider
接口的类,该类将负责提供参数化的值。在这个类中,可以定义一个方法来返回参数化的值列表。
然后,需要创建一个实现TestTemplateInvocationContext
接口的类,该类将负责在每个参数化的测试方法中执行相应的操作。在这个类中,可以使用之前定义的成员变量来获取参数化的值。
最后,在测试类中使用@ExtendWith
注解来注册自定义的扩展,并使用@TestTemplate
注解来标记参数化的测试方法。
下面是一个示例代码:
import org.junit.jupiter.api.extension.*;
import org.junit.jupiter.api.*;
public class ParameterizedTest implements BeforeEachCallback, AfterEachCallback {
private String parameter;
@Override
public void beforeEach(ExtensionContext context) throws Exception {
// 在每个测试方法之前执行的操作
parameter = context.getDisplayName(); // 这里示例使用测试方法的名称作为参数化的值
System.out.println("BeforeEach: " + parameter);
}
@Override
public void afterEach(ExtensionContext context) throws Exception {
// 在每个测试方法之后执行的操作
System.out.println("AfterEach: " + parameter);
}
@RegisterExtension
static Extension extension = new Extension() {
@Override
public void beforeEach(ExtensionContext context) throws Exception {
ParameterizedTest instance = (ParameterizedTest) context.getRequiredTestInstance();
instance.beforeEach(context);
}
@Override
public void afterEach(ExtensionContext context) throws Exception {
ParameterizedTest instance = (ParameterizedTest) context.getRequiredTestInstance();
instance.afterEach(context);
}
};
@TestTemplate
@ExtendWith(ParameterProvider.class)
void parameterizedTest(String parameter) {
// 参数化的测试方法
System.out.println("Parameterized Test: " + parameter);
}
static class ParameterProvider implements TestTemplateInvocationContextProvider {
@Override
public boolean supportsTestTemplate(ExtensionContext context) {
return true;
}
@Override
public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(ExtensionContext context) {
List<String> parameters = Arrays.asList("param1", "param2", "param3"); // 这里示例使用固定的参数化值列表
return parameters.stream().map(parameter ->
new TestTemplateInvocationContext() {
@Override
public String getDisplayName(int invocationIndex) {
return parameter;
}
@Override
public List<Extension> getAdditionalExtensions() {
return Collections.singletonList(extension);
}
});
}
}
}
在上面的示例代码中,我们创建了一个ParameterizedTest
类,实现了BeforeEachCallback
和AfterEachCallback
接口,并定义了一个成员变量parameter
来存储参数化的值。然后,我们创建了一个ParameterProvider
类,实现了TestTemplateInvocationContextProvider
接口,用于提供参数化的值。在ParameterProvider
类中,我们定义了一个方法provideTestTemplateInvocationContexts
来返回参数化的值列表,并在每个参数化的测试方法中执行相应的操作。最后,在测试类中使用@ExtendWith
注解注册自定义的扩展,并使用@TestTemplate
注解标记参数化的测试方法。
这样,我们就实现了在没有ParameterResolver的JUnit5中实现BeforeEach、AfterEach的参数化。
领取专属 10元无门槛券
手把手带您无忧上云