Skip to content

Commit

Permalink
Merge pull request #14352 from geoand/test-beforeclass-cl
Browse files Browse the repository at this point in the history
Ensure that QuarkusTestBeforeClassCallback is run on the Quarkus Classloader
  • Loading branch information
geoand authored Jan 18, 2021
2 parents fefa67c + 900c90c commit 03bb925
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import java.util.concurrent.atomic.AtomicInteger;

import org.junit.jupiter.api.Assertions;

import io.quarkus.test.junit.callback.QuarkusTestBeforeClassCallback;

public class SimpleAnnotationCheckerBeforeClassCallback implements QuarkusTestBeforeClassCallback {
Expand All @@ -10,11 +12,17 @@ public class SimpleAnnotationCheckerBeforeClassCallback implements QuarkusTestBe

@Override
public void beforeClass(Class<?> testClass) {
assertQuarkusClassLoader(Thread.currentThread().getContextClassLoader());
assertQuarkusClassLoader(testClass.getClassLoader());
// make sure that this comes into play only for the test we care about
if (!testClass.getName().endsWith("QuarkusTestCallbacksTestCase")) {
return;
}

count.incrementAndGet();
}

private void assertQuarkusClassLoader(ClassLoader contextClassLoader) {
Assertions.assertTrue(contextClassLoader.getClass().getName().contains("QuarkusClassLoader"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -647,10 +647,25 @@ public <T> T interceptTestClassConstructor(Invocation<T> invocation,
T result;
ClassLoader old = Thread.currentThread().getContextClassLoader();
Class<?> requiredTestClass = extensionContext.getRequiredTestClass();
for (Object beforeClassCallback : beforeClassCallbacks) {
beforeClassCallback.getClass().getMethod("beforeClass", Class.class).invoke(beforeClassCallback,
requiredTestClass);

if (runningQuarkusApplication != null) {
try {
Thread.currentThread().setContextClassLoader(runningQuarkusApplication.getClassLoader());
for (Object beforeClassCallback : beforeClassCallbacks) {
beforeClassCallback.getClass().getMethod("beforeClass", Class.class).invoke(beforeClassCallback,
runningQuarkusApplication.getClassLoader().loadClass(requiredTestClass.getName()));
}
} finally {
Thread.currentThread().setContextClassLoader(old);
}
} else {
// can this ever happen?
for (Object beforeClassCallback : beforeClassCallbacks) {
beforeClassCallback.getClass().getMethod("beforeClass", Class.class).invoke(beforeClassCallback,
requiredTestClass);
}
}

try {
Thread.currentThread().setContextClassLoader(requiredTestClass.getClassLoader());
result = invocation.proceed();
Expand Down

0 comments on commit 03bb925

Please sign in to comment.