如何使用 LauncherDiscoveryRequestBuilder 执行具有 TestInfo 类型参数的测试方法?
How do you use the LauncherDiscoveryRequestBuilder to execute a test method that has a parameter of type TestInfo?
我尝试了所有不同的方法 select 或者如本页所示: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)")
每次都没有找到测试。
当我只select class 方法所在时,它起作用了:selectClass("org.example.order.OrderTests")
(但我希望明确调用该方法)
我假设对于在运行时由 ParameterResolver 解析的其他参数类型,行为是相同的。
你的假设是错误的。您可以 select 一种且只有一种测试方法。
正如您在此页面上提到的 Discovery Selectors 有很多示例。
DiscoverySelectors.selectMethod 提供三种方法 select 所需的方法
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.Whosebug;
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.Whosebug;
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.Whosebug.ClassWithTestInfo#foo(TestInfo)";
var methods = discover(DiscoverySelectors.selectMethod(fqmn));
Assertions.assertEquals(0, methods.size());
},
() -> {
// good way
var fqmn = "io.github.zforgo.Whosebug.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;
}
}
我尝试了所有不同的方法 select 或者如本页所示: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)")
每次都没有找到测试。
当我只select class 方法所在时,它起作用了:selectClass("org.example.order.OrderTests")
(但我希望明确调用该方法)
我假设对于在运行时由 ParameterResolver 解析的其他参数类型,行为是相同的。
你的假设是错误的。您可以 select 一种且只有一种测试方法。 正如您在此页面上提到的 Discovery Selectors 有很多示例。
DiscoverySelectors.selectMethod 提供三种方法 select 所需的方法
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.Whosebug;
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.Whosebug;
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.Whosebug.ClassWithTestInfo#foo(TestInfo)";
var methods = discover(DiscoverySelectors.selectMethod(fqmn));
Assertions.assertEquals(0, methods.size());
},
() -> {
// good way
var fqmn = "io.github.zforgo.Whosebug.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;
}
}