Skip to content

Commit 10d163d

Browse files
committed
Support RunWith annotation for JUnit4
1 parent f2bfae8 commit 10d163d

File tree

6 files changed

+45
-6
lines changed

6 files changed

+45
-6
lines changed

common/junit-platform-native/src/main/java/org/graalvm/junit/platform/JUnitPlatformFeature.java

+5
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ public static void debug(String format, Object... args) {
8484
}
8585
}
8686

87+
@Override
88+
public void afterRegistration(AfterRegistrationAccess access) {
89+
extensionConfigProviders.forEach(p -> p.initialize(access.getApplicationClassLoader(), nativeImageConfigImpl));
90+
}
91+
8792
public static boolean debug() {
8893
return ImageSingletons.lookup(JUnitPlatformFeature.class).debug;
8994
}

common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/NativeImageConfiguration.java

+5
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ default void registerAllClassMembersForReflection(Class<?>... classes) {
6666
registerForReflection(clazz.getDeclaredConstructors());
6767
registerForReflection(clazz.getDeclaredMethods());
6868
registerForReflection(clazz.getDeclaredFields());
69+
70+
Class<?>[] declaredClasses = clazz.getDeclaredClasses();
71+
for (Class<?> cls : declaredClasses) {
72+
registerAllClassMembersForReflection(cls);
73+
}
6974
}
7075
}
7176
}

common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/core/PluginConfigProvider.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,18 @@
4141

4242
package org.graalvm.junit.platform.config.core;
4343

44-
public interface PluginConfigProvider {
44+
public abstract class PluginConfigProvider {
4545

46-
void onLoad(NativeImageConfiguration config);
46+
protected ClassLoader applicationClassLoader;
47+
protected NativeImageConfiguration nativeImageConfigImpl;
4748

48-
void onTestClassRegistered(Class<?> testClass, NativeImageConfiguration registry);
4949

50+
public abstract void onLoad(NativeImageConfiguration config);
51+
52+
public abstract void onTestClassRegistered(Class<?> testClass, NativeImageConfiguration registry);
53+
54+
public final void initialize(ClassLoader classLoader, NativeImageConfiguration nic) {
55+
applicationClassLoader = classLoader;
56+
nativeImageConfigImpl = nic;
57+
}
5058
}

common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/jupiter/JupiterConfigProvider.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363

6464
import static org.graalvm.junit.platform.JUnitPlatformFeature.debug;
6565

66-
public class JupiterConfigProvider implements PluginConfigProvider {
66+
public class JupiterConfigProvider extends PluginConfigProvider {
6767

6868
@Override
6969
public void onLoad(NativeImageConfiguration config) {

common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/platform/PlatformConfigProvider.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
import org.junit.platform.launcher.TestIdentifier;
4848

4949

50-
public class PlatformConfigProvider implements PluginConfigProvider {
50+
public class PlatformConfigProvider extends PluginConfigProvider {
5151

5252
@Override
5353
public void onLoad(NativeImageConfiguration config) {

common/junit-platform-native/src/main/java/org/graalvm/junit/platform/config/vintage/VintageConfigProvider.java

+22-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@
4646
import org.graalvm.nativeimage.hosted.RuntimeReflection;
4747
import org.graalvm.nativeimage.hosted.RuntimeSerialization;
4848

49-
public class VintageConfigProvider implements PluginConfigProvider {
49+
import java.lang.annotation.Annotation;
50+
import java.lang.reflect.Method;
51+
52+
public class VintageConfigProvider extends PluginConfigProvider {
5053

5154
@Override
5255
public void onLoad(NativeImageConfiguration config) {
@@ -60,5 +63,23 @@ public void onLoad(NativeImageConfiguration config) {
6063

6164
@Override
6265
public void onTestClassRegistered(Class<?> testClass, NativeImageConfiguration registry) {
66+
registerAnnotationClassesForReflection("org.junit.runner.RunWith", "value", testClass);
67+
registerAnnotationClassesForReflection("org.junit.runners.Parameterized.UseParametersRunnerFactory", "value", testClass);
68+
}
69+
70+
@SuppressWarnings("unchecked")
71+
private void registerAnnotationClassesForReflection(String annotationClass, String classProviderMethod, Class<?> testClass) {
72+
try {
73+
Class<Annotation> annotation = (Class<Annotation>) applicationClassLoader.loadClass(annotationClass);
74+
Method classProvider = annotation.getDeclaredMethod(classProviderMethod);
75+
76+
Annotation classAnnotation = testClass.getAnnotation(annotation);
77+
if (classAnnotation != null) {
78+
Class<?> annotationArgument = (Class<?>) classProvider.invoke(classAnnotation);
79+
nativeImageConfigImpl.registerAllClassMembersForReflection(annotationArgument);
80+
}
81+
} catch (ReflectiveOperationException e) {
82+
// intentionally ignored
83+
}
6384
}
6485
}

0 commit comments

Comments
 (0)