Skip to content

Commit

Permalink
Add support for @nested
Browse files Browse the repository at this point in the history
I don't really understand the use case for @nested, but this
should make it work now.

Fixes #11323
  • Loading branch information
stuartwdouglas authored and geoand committed Jan 11, 2021
1 parent 8e3fdd3 commit 674d735
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static org.hamcrest.Matchers.contains;

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

import io.quarkus.test.junit.QuarkusTest;
Expand All @@ -10,9 +11,13 @@
@QuarkusTest
public class JaxbTestCase {

@Test
public void testNews() {
RestAssured.when().get("/test/jaxb/getnews").then()
.body("author", contains("Emmanuel Bernard"));
@Nested
class SomeClass {
@Test
public void testNews() {
RestAssured.when().get("/test/jaxb/getnews").then()
.body("author", contains("Emmanuel Bernard"));
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.AbstractMap;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
Expand All @@ -40,6 +42,7 @@
import org.jboss.jandex.Index;
import org.jboss.jandex.Type;
import org.jboss.logging.Logger;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
Expand Down Expand Up @@ -119,6 +122,8 @@ public class QuarkusTestExtension
private static List<Function<Class<?>, String>> testHttpEndpointProviders;

private static DeepClone deepClone;
//needed for @Nested
private static Deque<Class<?>> currentTestClassStack = new ArrayDeque<>();

private ExtensionState doJavaStart(ExtensionContext context, Class<? extends QuarkusTestProfile> profile) throws Throwable {
quarkusTestProfile = profile;
Expand Down Expand Up @@ -382,7 +387,7 @@ private void populateCallbacks(ClassLoader classLoader) throws ClassNotFoundExce

@Override
public void beforeEach(ExtensionContext context) throws Exception {
if (isNativeTest(context)) {
if (isNativeTest()) {
return;
}
if (!failedBoot) {
Expand Down Expand Up @@ -450,7 +455,7 @@ public static String getEndpointPath(ExtensionContext context, List<Function<Cla

@Override
public void afterEach(ExtensionContext context) throws Exception {
if (isNativeTest(context)) {
if (isNativeTest()) {
return;
}
if (!failedBoot) {
Expand Down Expand Up @@ -513,8 +518,13 @@ public void afterEach(ExtensionContext context) throws Exception {
constructor.newInstance(actualTestInstance, actualTestMethod));
}

private boolean isNativeTest(ExtensionContext context) {
return context.getRequiredTestClass().isAnnotationPresent(NativeImageTest.class);
private boolean isNativeTest() {
for (Class<?> i : currentTestClassStack) {
if (i.isAnnotationPresent(NativeImageTest.class)) {
return true;
}
}
return false;
}

private ExtensionState ensureStarted(ExtensionContext extensionContext) {
Expand Down Expand Up @@ -569,9 +579,10 @@ private void throwBootFailureException() throws Exception {

@Override
public void beforeAll(ExtensionContext context) throws Exception {
currentTestClassStack.push(context.getRequiredTestClass());
//set the right launch mode in the outer CL, used by the HTTP host config source
ProfileManager.setLaunchMode(LaunchMode.TEST);
if (isNativeTest(context)) {
if (isNativeTest()) {
return;
}
ensureStarted(context);
Expand Down Expand Up @@ -609,7 +620,7 @@ private void popMockContext() {
@Override
public void interceptBeforeAllMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext,
ExtensionContext extensionContext) throws Throwable {
if (isNativeTest(extensionContext)) {
if (isNativeTest()) {
invocation.proceed();
return;
}
Expand All @@ -625,7 +636,7 @@ public void interceptBeforeAllMethod(Invocation<Void> invocation, ReflectiveInvo
@Override
public <T> T interceptTestClassConstructor(Invocation<T> invocation,
ReflectiveInvocationContext<Constructor<T>> invocationContext, ExtensionContext extensionContext) throws Throwable {
if (isNativeTest(extensionContext)) {
if (isNativeTest()) {
return invocation.proceed();
}
ExtensionState state = ensureStarted(extensionContext);
Expand Down Expand Up @@ -672,8 +683,15 @@ private void initTestState(ExtensionContext extensionContext, ExtensionState sta
Class<?> previousActualTestClass = actualTestClass;
actualTestClass = Class.forName(extensionContext.getRequiredTestClass().getName(), true,
Thread.currentThread().getContextClassLoader());

actualTestInstance = runningQuarkusApplication.instance(actualTestClass);
if (extensionContext.getRequiredTestClass().isAnnotationPresent(Nested.class)) {
Class<?> parent = actualTestClass.getEnclosingClass();
Object parentInstance = runningQuarkusApplication.instance(parent);
Constructor<?> declaredConstructor = actualTestClass.getDeclaredConstructor(parent);
declaredConstructor.setAccessible(true);
actualTestInstance = declaredConstructor.newInstance(parentInstance);
} else {
actualTestInstance = runningQuarkusApplication.instance(actualTestClass);
}

Class<?> resM = Thread.currentThread().getContextClassLoader().loadClass(TestHTTPResourceManager.class.getName());
resM.getDeclaredMethod("inject", Object.class, List.class).invoke(null, actualTestInstance,
Expand All @@ -696,7 +714,7 @@ private void initTestState(ExtensionContext extensionContext, ExtensionState sta
@Override
public void interceptBeforeEachMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext,
ExtensionContext extensionContext) throws Throwable {
if (isNativeTest(extensionContext)) {
if (isNativeTest()) {
invocation.proceed();
return;
}
Expand All @@ -707,7 +725,7 @@ public void interceptBeforeEachMethod(Invocation<Void> invocation, ReflectiveInv
@Override
public void interceptTestMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext,
ExtensionContext extensionContext) throws Throwable {
if (isNativeTest(extensionContext)) {
if (isNativeTest()) {
invocation.proceed();
return;
}
Expand All @@ -718,7 +736,7 @@ public void interceptTestMethod(Invocation<Void> invocation, ReflectiveInvocatio
@Override
public void interceptTestTemplateMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext,
ExtensionContext extensionContext) throws Throwable {
if (isNativeTest(extensionContext)) {
if (isNativeTest()) {
invocation.proceed();
return;
}
Expand All @@ -730,7 +748,7 @@ public void interceptTestTemplateMethod(Invocation<Void> invocation, ReflectiveI
@Override
public <T> T interceptTestFactoryMethod(Invocation<T> invocation,
ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
if (isNativeTest(extensionContext)) {
if (isNativeTest()) {
return invocation.proceed();
}
T result = (T) runExtensionMethod(invocationContext, extensionContext);
Expand All @@ -741,7 +759,7 @@ public <T> T interceptTestFactoryMethod(Invocation<T> invocation,
@Override
public void interceptAfterEachMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext,
ExtensionContext extensionContext) throws Throwable {
if (isNativeTest(extensionContext)) {
if (isNativeTest()) {
invocation.proceed();
return;
}
Expand All @@ -752,7 +770,7 @@ public void interceptAfterEachMethod(Invocation<Void> invocation, ReflectiveInvo
@Override
public void interceptAfterAllMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext,
ExtensionContext extensionContext) throws Throwable {
if (isNativeTest(extensionContext)) {
if (isNativeTest()) {
invocation.proceed();
return;
}
Expand Down Expand Up @@ -816,11 +834,15 @@ private Object runExtensionMethod(ReflectiveInvocationContext<Method> invocation

@Override
public void afterAll(ExtensionContext context) throws Exception {
if (!isNativeTest(context) && (runningQuarkusApplication != null)) {
popMockContext();
}
if (originalCl != null) {
setCCL(originalCl);
try {
if (!isNativeTest() && (runningQuarkusApplication != null)) {
popMockContext();
}
if (originalCl != null) {
setCCL(originalCl);
}
} finally {
currentTestClassStack.pop();
}
}

Expand Down

0 comments on commit 674d735

Please sign in to comment.