Skip to content

Commit b3f6c99

Browse files
committed
Test @MethodSource with custom ClassLoader arrangement
See #3279 See #3280
1 parent 8bfe25a commit b3f6c99

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/MethodArgumentsProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ private static boolean looksLikeAFullyQualifiedMethodName(String factoryMethodNa
104104
return true;
105105
}
106106

107-
private static Method findFactoryMethodByFullyQualifiedName(Class<?> testClass, Method testMethod,
107+
// package-private for testing
108+
static Method findFactoryMethodByFullyQualifiedName(Class<?> testClass, Method testMethod,
108109
String fullyQualifiedMethodName) {
109110
String[] methodParts = ReflectionUtils.parseFullyQualifiedMethodName(fullyQualifiedMethodName);
110111
String className = methodParts[0];

junit-jupiter-params/src/test/java/org/junit/jupiter/params/provider/MethodArgumentsProviderTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.junit.jupiter.params.ParameterizedTest;
4242
import org.junit.platform.commons.JUnitException;
4343
import org.junit.platform.commons.PreconditionViolationException;
44+
import org.junit.platform.commons.test.TestClassLoader;
4445
import org.junit.platform.commons.util.ReflectionUtils;
4546

4647
/**
@@ -237,6 +238,31 @@ void providesArgumentsUsingExternalFactoryMethod() {
237238
assertThat(arguments).containsExactly(array("string1"), array("string2"));
238239
}
239240

241+
@Test
242+
void providesArgumentsUsingExternalFactoryMethodInTypeFromDifferentClassLoader() throws Exception {
243+
try (var testClassLoader = TestClassLoader.forClasses(TestCase.class, ExternalFactoryMethods.class)) {
244+
var testClass = testClassLoader.loadClass(TestCase.class.getName());
245+
var testMethod = ReflectionUtils.findMethod(testClass, "test").get();
246+
var fullyQualifiedMethodName = ExternalFactoryMethods.class.getName() + "#stringsProvider";
247+
248+
assertThat(testClass.getClassLoader()).isSameAs(testClassLoader);
249+
250+
var arguments = provideArguments(testClass, false, fullyQualifiedMethodName);
251+
assertThat(arguments).containsExactly(array("string1"), array("string2"));
252+
253+
var factoryMethod = MethodArgumentsProvider.findFactoryMethodByFullyQualifiedName(testClass, testMethod,
254+
fullyQualifiedMethodName);
255+
assertThat(factoryMethod).isNotNull();
256+
assertThat(factoryMethod.getName()).isEqualTo("stringsProvider");
257+
assertThat(factoryMethod.getParameterTypes()).isEmpty();
258+
259+
var declaringClass = factoryMethod.getDeclaringClass();
260+
assertThat(declaringClass.getName()).isEqualTo(ExternalFactoryMethods.class.getName());
261+
assertThat(declaringClass).isNotEqualTo(ExternalFactoryMethods.class);
262+
assertThat(declaringClass.getClassLoader()).isSameAs(testClassLoader);
263+
}
264+
}
265+
240266
@Test
241267
void providesArgumentsUsingExternalFactoryMethodWithParentheses() {
242268
var arguments = provideArguments(ExternalFactoryMethods.class.getName() + "#stringsProvider()");

0 commit comments

Comments
 (0)