如何使用LauncherDiscoveryRequestBuilder执行参数类型为TestInfo的测试方法?

时间:2019-10-25 18:23:29

标签: junit5

我尝试了所有不同的方法选择器,如本页所示:https://junit.org/junit5/docs/current/api/org/junit/platform/launcher/core/LauncherDiscoveryRequestBuilder.html

例如,尝试这样做: selectMethod("org.example.order.OrderTests#test3")

像这样: selectMethod("org.example.order.OrderTests#test3(TestInfo)")

或类似的方式:selectMethod("org.example.order.OrderTests#test3(org.junit.jupiter.engine.extension.TestInfoParameterResolver$DefaultTestInfo)")

每次都找不到测试。

当我仅选择该方法所在的类时,它可以工作:selectClass("org.example.order.OrderTests") (但我希望显式调用该方法)

我假设在运行时由ParameterResolver解析的其他参数类型的行为相同。

1 个答案:

答案 0 :(得分:1)

您的假设是错误的。您只能选择一种测试方法。 如您在此页面Discovery Selectors所述,有很多示例。

DiscoverySelectors.selectMethod提供了三种选择所需方法的方法

public static MethodSelector selectMethod(String className, String methodName, String methodParameterTypes) {
   ...
}

public static MethodSelector selectMethod(String className, String methodName) {
   ...
}

and

public static MethodSelector selectMethod(String fullyQualifiedMethodName) throws PreconditionViolationException {
   ...
}

您尝试使用最后一种方法,但是fullyQualifiedMethodName有点错误。如果您查看javadoc,它将显示出来。 参数类型列表必须完全匹配,并且每个非基本类型也必须完全限定。

在您的示例中,缺少包装。像这样尝试:selectMethod("org.example.order.OrderTests#test3(org.junit.jupiter.api.TestInfo)")

这是一个简短的测试。

package io.github.zforgo.stackoverflow;

import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

public class ClassWithTestInfo {

    @Test
    void foo() {
    }

    @Test
    void foo(TestInfo info) {
    }

    @RepeatedTest(3)
    void foo(RepetitionInfo info) {
    }
}

package io.github.zforgo.stackoverflow;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.engine.descriptor.MethodBasedTestDescriptor;
import org.junit.platform.engine.DiscoverySelector;
import org.junit.platform.engine.FilterResult;
import org.junit.platform.engine.discovery.DiscoverySelectors;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.PostDiscoveryFilter;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

class DiscoveryTest {

    @Test
    @DisplayName("Should select only the desired method(s)")
    void doTEst() {
        Assertions.assertAll(
                () -> {
                    var methods = discover(DiscoverySelectors.selectClass(ClassWithTestInfo.class));
                    Assertions.assertEquals(3, methods.size());
                },
                () -> {
                    // your way
                    var fqmn = "io.github.zforgo.stackoverflow.ClassWithTestInfo#foo(TestInfo)";
                    var methods = discover(DiscoverySelectors.selectMethod(fqmn));
                    Assertions.assertEquals(0, methods.size());
                },
                () -> {
                    // good way
                    var fqmn = "io.github.zforgo.stackoverflow.ClassWithTestInfo#foo(org.junit.jupiter.api.TestInfo)";
                    var methods = discover(DiscoverySelectors.selectMethod(fqmn));
                    Assertions.assertEquals(1, methods.size());
                }
        );
    }

    private List<Method> discover(DiscoverySelector... selectors) {
        final List<Method> methodCollector = new ArrayList<>();
        LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
                .selectors(selectors)
                .filters((PostDiscoveryFilter) object -> {
                    Method m = ((MethodBasedTestDescriptor) object).getTestMethod();
                    methodCollector.add(m);
                    return FilterResult.included("Matched");
                })
                .build();
        LauncherFactory.create().discover(request);

        return methodCollector;
    }
}