diff --git a/core/runtime/pom.xml b/core/runtime/pom.xml
index 9edd8f92208c1..439cb05b18a1f 100644
--- a/core/runtime/pom.xml
+++ b/core/runtime/pom.xml
@@ -120,6 +120,11 @@
org.objenesis:objenesis
net.bytebuddy:byte-buddy
net.bytebuddy:byte-buddy-agent
+ org.junit.jupiter:junit-jupiter-api
+ org.junit.jupiter:junit-jupiter-engine
+ org.junit.jupiter:junit-jupiter-params
+ org.junit.platform:junit-platform-commons
+ org.junit.platform:junit-platform-engine
io.smallrye:smallrye-config
diff --git a/integration-tests/main/src/test/java/io/quarkus/it/main/DynamicTestsTestCase.java b/integration-tests/main/src/test/java/io/quarkus/it/main/DynamicTestsTestCase.java
new file mode 100644
index 0000000000000..875324903111b
--- /dev/null
+++ b/integration-tests/main/src/test/java/io/quarkus/it/main/DynamicTestsTestCase.java
@@ -0,0 +1,39 @@
+package io.quarkus.it.main;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestFactory;
+
+import io.quarkus.it.arc.UnusedBean;
+import io.quarkus.test.junit.QuarkusTest;
+
+@QuarkusTest
+public class DynamicTestsTestCase {
+
+ @Inject
+ UnusedBean bean;
+
+ @Test
+ public void testInjection() {
+ assertNotNull(bean);
+ }
+
+ @TestFactory
+ public List> dynamicTests() {
+ return Arrays.asList(
+ DynamicTest.dynamicTest("test 1", () -> {
+ assertNotNull(bean);
+ }),
+ DynamicTest.dynamicTest("test 2", () -> {
+ assertEquals(1, 1);
+ }));
+ }
+}
diff --git a/test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java b/test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java
index b4fd2185dabd1..e273ae8a28795 100644
--- a/test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java
+++ b/test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java
@@ -320,6 +320,17 @@ public void interceptTestTemplateMethod(Invocation invocation, ReflectiveI
invocation.skip();
}
+ @Override
+ public T interceptTestFactoryMethod(Invocation invocation,
+ ReflectiveInvocationContext invocationContext, ExtensionContext extensionContext) throws Throwable {
+ if (isNativeTest(extensionContext)) {
+ return invocation.proceed();
+ }
+ T result = (T) runExtensionMethod(invocationContext, extensionContext);
+ invocation.skip();
+ return result;
+ }
+
@Override
public void interceptAfterEachMethod(Invocation invocation, ReflectiveInvocationContext invocationContext,
ExtensionContext extensionContext) throws Throwable {
@@ -342,7 +353,7 @@ public void interceptAfterAllMethod(Invocation invocation, ReflectiveInvoc
invocation.skip();
}
- private void runExtensionMethod(ReflectiveInvocationContext invocationContext, ExtensionContext extensionContext)
+ private Object runExtensionMethod(ReflectiveInvocationContext invocationContext, ExtensionContext extensionContext)
throws Throwable {
Method newMethod = null;
@@ -389,7 +400,7 @@ private void runExtensionMethod(ReflectiveInvocationContext invocationCo
}
}
- newMethod.invoke(actualTestInstance, argumentsFromTccl.toArray(new Object[0]));
+ return newMethod.invoke(actualTestInstance, argumentsFromTccl.toArray(new Object[0]));
} catch (InvocationTargetException e) {
throw e.getCause();
} catch (IllegalAccessException | ClassNotFoundException e) {