Browse Source

Support overloaded test methods in CompileWithTargetClassAccessExtension

Prior to this commit, CompileWithTargetClassAccessExtension failed to
properly select overloaded test methods because it ignored the method
parameter list when looking up the test method.

This commit addresses this issue by selecting the test method using its
fully qualified method name which takes in account the class name,
method name, and parameter names.

Closes gh-28901
pull/28908/head
Sam Brannen 3 years ago
parent
commit
ce850a583c
  1. 26
      spring-core-test/src/main/java/org/springframework/aot/test/generator/compile/CompileWithTargetClassAccessExtension.java

26
spring-core-test/src/main/java/org/springframework/aot/test/generator/compile/CompileWithTargetClassAccessExtension.java

@ -28,9 +28,7 @@ import org.junit.platform.launcher.core.LauncherFactory; @@ -28,9 +28,7 @@ import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.junit.platform.launcher.listeners.TestExecutionSummary;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
import static org.junit.platform.commons.util.ReflectionUtils.getFullyQualifiedMethodName;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectMethod;
import static org.junit.platform.launcher.EngineFilter.includeEngines;
@ -121,20 +119,18 @@ class CompileWithTargetClassAccessExtension implements InvocationInterceptor { @@ -121,20 +119,18 @@ class CompileWithTargetClassAccessExtension implements InvocationInterceptor {
testClass.getClassLoader());
Thread.currentThread().setContextClassLoader(forkedClassPathClassLoader);
try {
runTest(forkedClassPathClassLoader, testClass.getName(), testMethod.getName());
runTest(forkedClassPathClassLoader, testClass, testMethod);
}
finally {
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
}
private void runTest(ClassLoader classLoader, String testClassName, String testMethodName)
private void runTest(ClassLoader classLoader, Class<?> testClass, Method testMethod)
throws Throwable {
Class<?> testClass = classLoader.loadClass(testClassName);
Method testMethod = findMethod(testClass, testMethodName);
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
.selectors(selectMethod(testClass, testMethod))
.selectors(selectMethod(getFullyQualifiedMethodName(testClass, testMethod)))
.filters(includeEngines("junit-jupiter"))
.build();
SummaryGeneratingListener listener = new SummaryGeneratingListener();
@ -146,20 +142,6 @@ class CompileWithTargetClassAccessExtension implements InvocationInterceptor { @@ -146,20 +142,6 @@ class CompileWithTargetClassAccessExtension implements InvocationInterceptor {
}
}
private Method findMethod(Class<?> testClass, String testMethodName) {
Method method = ReflectionUtils.findMethod(testClass, testMethodName);
if (method == null) {
Method[] methods = ReflectionUtils.getUniqueDeclaredMethods(testClass);
for (Method candidate : methods) {
if (candidate.getName().equals(testMethodName)) {
return candidate;
}
}
}
Assert.state(method != null, () -> "Unable to find " + testClass + "." + testMethodName);
return method;
}
@FunctionalInterface
interface Action {

Loading…
Cancel
Save