首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在没有ParameterResolver的JUnit5中实现BeforeEach、AfterEach的参数化

,可以通过编写自定义的扩展来实现。

首先,需要创建一个实现BeforeEachCallbackAfterEachCallback接口的类,该类将负责在每个测试方法之前和之后执行相应的操作。在这个类中,可以定义一个成员变量来存储参数化的值。

接下来,需要创建一个实现TestTemplateInvocationContextProvider接口的类,该类将负责提供参数化的值。在这个类中,可以定义一个方法来返回参数化的值列表。

然后,需要创建一个实现TestTemplateInvocationContext接口的类,该类将负责在每个参数化的测试方法中执行相应的操作。在这个类中,可以使用之前定义的成员变量来获取参数化的值。

最后,在测试类中使用@ExtendWith注解来注册自定义的扩展,并使用@TestTemplate注解来标记参数化的测试方法。

下面是一个示例代码:

代码语言:txt
复制
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类,实现了BeforeEachCallbackAfterEachCallback接口,并定义了一个成员变量parameter来存储参数化的值。然后,我们创建了一个ParameterProvider类,实现了TestTemplateInvocationContextProvider接口,用于提供参数化的值。在ParameterProvider类中,我们定义了一个方法provideTestTemplateInvocationContexts来返回参数化的值列表,并在每个参数化的测试方法中执行相应的操作。最后,在测试类中使用@ExtendWith注解注册自定义的扩展,并使用@TestTemplate注解标记参数化的测试方法。

这样,我们就实现了在没有ParameterResolver的JUnit5中实现BeforeEach、AfterEach的参数化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券