classOrderer();
+
/**
* Tags that should be included for continuous testing. This supports JUnit Tag Expressions.
*
@@ -77,7 +89,6 @@ public interface TestConfig {
* is matched against the test class name (not the file name).
*
* This is ignored if include-pattern has been set.
- *
*/
@WithDefault(".*\\.IT[^.]+|.*IT|.*ITCase")
Optional excludePattern();
@@ -241,7 +252,6 @@ public interface TestConfig {
* is matched against the module groupId:artifactId.
*
* This is ignored if include-module-pattern has been set.
- *
*/
Optional excludeModulePattern();
@@ -265,7 +275,7 @@ interface Profile {
* then Quarkus will only execute tests that are annotated with a {@code @TestProfile} that has at least one of the
* supplied (via the aforementioned system property) tags.
*/
- Optional> tags();
+ Optional> tags();
}
interface Container {
diff --git a/core/runtime/src/main/java/io/quarkus/runtime/configuration/QuarkusConfigFactory.java b/core/runtime/src/main/java/io/quarkus/runtime/configuration/QuarkusConfigFactory.java
index 2adc409fab816..85f778217b946 100644
--- a/core/runtime/src/main/java/io/quarkus/runtime/configuration/QuarkusConfigFactory.java
+++ b/core/runtime/src/main/java/io/quarkus/runtime/configuration/QuarkusConfigFactory.java
@@ -1,5 +1,7 @@
package io.quarkus.runtime.configuration;
+import org.eclipse.microprofile.config.spi.ConfigProviderResolver;
+
import io.quarkus.runtime.LaunchMode;
import io.smallrye.config.SmallRyeConfig;
import io.smallrye.config.SmallRyeConfigFactory;
@@ -12,13 +14,6 @@ public final class QuarkusConfigFactory extends SmallRyeConfigFactory {
private static volatile SmallRyeConfig config;
- /**
- * Construct a new instance. Called by service loader.
- */
- public QuarkusConfigFactory() {
- // todo: replace with {@code provider()} post-Java 11
- }
-
@Override
public SmallRyeConfig getConfigFor(final SmallRyeConfigProviderResolver configProviderResolver,
final ClassLoader classLoader) {
@@ -30,15 +25,12 @@ public SmallRyeConfig getConfigFor(final SmallRyeConfigProviderResolver configPr
}
public static void setConfig(SmallRyeConfig config) {
- SmallRyeConfigProviderResolver configProviderResolver = (SmallRyeConfigProviderResolver) SmallRyeConfigProviderResolver
- .instance();
+ ConfigProviderResolver configProviderResolver = ConfigProviderResolver.instance();
// Uninstall previous config
if (QuarkusConfigFactory.config != null) {
configProviderResolver.releaseConfig(QuarkusConfigFactory.config);
QuarkusConfigFactory.config = null;
}
- // Also release the TCCL config, in case that config was not QuarkusConfigFactory.config
- configProviderResolver.releaseConfig(Thread.currentThread().getContextClassLoader());
// Install new config
if (config != null) {
QuarkusConfigFactory.config = config;
diff --git a/docs/src/main/asciidoc/getting-started-testing.adoc b/docs/src/main/asciidoc/getting-started-testing.adoc
index 916b16f57fd08..e2c0fac89ccbe 100644
--- a/docs/src/main/asciidoc/getting-started-testing.adoc
+++ b/docs/src/main/asciidoc/getting-started-testing.adoc
@@ -472,24 +472,10 @@ a bit slower, as it adds a shutdown/startup cycle to the test time, but gives a
To reduce the amount of times Quarkus needs to restart, `io.quarkus.test.junit.util.QuarkusTestProfileAwareClassOrderer`
is registered as a global `ClassOrderer` as described in the
link:https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order-classes[JUnit 5 User Guide].
-The behavior of this `ClassOrderer` is configurable via `junit-platform.properties` (see the source code or javadoc for more details).
-It can also be disabled entirely by setting another `ClassOrderer` that is provided by JUnit 5 or even your own custom one. +
-Please note that as of JUnit 5.8.2 link:https://github.com/junit-team/junit5/issues/2794[only a single `junit-platform.properties` is picked up and a warning is logged if more than one is found].
-If you encounter such warnings, you can get rid of them by removing the Quarkus-supplied `junit-platform.properties` from the classpath via an exclusion:
-[source,xml]
-----
-
- io.quarkus
- quarkus-junit5
- test
-
-
- io.quarkus
- quarkus-junit5-properties
-
-
-
-----
+The behavior of this `ClassOrderer` is configurable via `application.properties` using the property
+`quarkus.test.class-orderer`. The property accepts the FQCN of the `ClassOrderer` to use. If the class cannot be found,
+it fallbacks to JUnit default behaviour which does not set a `ClassOrderer` at all. It can also be disabled entirely by
+setting another `ClassOrderer` that is provided by JUnit 5 or even your own custom one.
=== Writing a Profile
diff --git a/extensions/scheduler/common/src/main/java/io/quarkus/scheduler/common/runtime/util/SchedulerUtils.java b/extensions/scheduler/common/src/main/java/io/quarkus/scheduler/common/runtime/util/SchedulerUtils.java
index 96b87a5e33ce3..289b9beef6876 100644
--- a/extensions/scheduler/common/src/main/java/io/quarkus/scheduler/common/runtime/util/SchedulerUtils.java
+++ b/extensions/scheduler/common/src/main/java/io/quarkus/scheduler/common/runtime/util/SchedulerUtils.java
@@ -14,7 +14,7 @@
import jakarta.enterprise.inject.Instance;
import org.eclipse.microprofile.config.Config;
-import org.eclipse.microprofile.config.spi.ConfigProviderResolver;
+import org.eclipse.microprofile.config.ConfigProvider;
import io.quarkus.arc.Arc;
import io.quarkus.runtime.configuration.DurationConverter;
@@ -147,9 +147,7 @@ private static String adjustExpressionSyntax(String val) {
* Adapted from {@link io.smallrye.config.ExpressionConfigSourceInterceptor}
*/
private static String resolvePropertyExpression(String expr) {
- // Force the runtime CL in order to make the DEV UI page work
- final ClassLoader cl = SchedulerUtils.class.getClassLoader();
- final Config config = ConfigProviderResolver.instance().getConfig(cl);
+ final Config config = ConfigProvider.getConfig();
final Expression expression = Expression.compile(expr, LENIENT_SYNTAX, NO_TRIM);
final String expanded = expression.evaluate(new BiConsumer, StringBuilder>() {
@Override
diff --git a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/runtime/VertxEventBusConsumerRecorder.java b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/runtime/VertxEventBusConsumerRecorder.java
index 145e34e844bd8..469458e5117f2 100644
--- a/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/runtime/VertxEventBusConsumerRecorder.java
+++ b/extensions/vertx/runtime/src/main/java/io/quarkus/vertx/runtime/VertxEventBusConsumerRecorder.java
@@ -19,7 +19,7 @@
import java.util.function.Supplier;
import org.eclipse.microprofile.config.Config;
-import org.eclipse.microprofile.config.spi.ConfigProviderResolver;
+import org.eclipse.microprofile.config.ConfigProvider;
import org.jboss.logging.Logger;
import io.quarkus.arc.CurrentContextFactory;
@@ -310,9 +310,7 @@ private static String lookUpPropertyValue(String propertyValue) {
* Adapted from {@link io.smallrye.config.ExpressionConfigSourceInterceptor}
*/
private static String resolvePropertyExpression(String expr) {
- // Force the runtime CL in order to make the DEV UI page work
- final ClassLoader cl = VertxEventBusConsumerRecorder.class.getClassLoader();
- final Config config = ConfigProviderResolver.instance().getConfig(cl);
+ final Config config = ConfigProvider.getConfig();
final Expression expression = Expression.compile(expr, LENIENT_SYNTAX, NO_TRIM);
final String expanded = expression.evaluate(new BiConsumer, StringBuilder>() {
@Override
diff --git a/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-callback-from-extension/src/main/resources/application.properties b/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-callback-from-extension/src/main/resources/application.properties
index 8d698e657885b..442095ca8410c 100644
--- a/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-callback-from-extension/src/main/resources/application.properties
+++ b/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-callback-from-extension/src/main/resources/application.properties
@@ -1,3 +1 @@
-quarkus.test.continuous-testing=enabled
-# this should not be needed, but something in the tests is setting this to 1234 and confusing the test framework, so set it here to match
-quarkus.http.non-application-root-path=1234
\ No newline at end of file
+quarkus.test.continuous-testing=enabled
\ No newline at end of file
diff --git a/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-parameter-injection/src/main/resources/application.properties b/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-parameter-injection/src/main/resources/application.properties
index 8d698e657885b..442095ca8410c 100644
--- a/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-parameter-injection/src/main/resources/application.properties
+++ b/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-parameter-injection/src/main/resources/application.properties
@@ -1,3 +1 @@
-quarkus.test.continuous-testing=enabled
-# this should not be needed, but something in the tests is setting this to 1234 and confusing the test framework, so set it here to match
-quarkus.http.non-application-root-path=1234
\ No newline at end of file
+quarkus.test.continuous-testing=enabled
\ No newline at end of file
diff --git a/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-template-from-extension-with-bytecode-changes/src/main/resources/application.properties b/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-template-from-extension-with-bytecode-changes/src/main/resources/application.properties
index 8d698e657885b..442095ca8410c 100644
--- a/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-template-from-extension-with-bytecode-changes/src/main/resources/application.properties
+++ b/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-template-from-extension-with-bytecode-changes/src/main/resources/application.properties
@@ -1,3 +1 @@
-quarkus.test.continuous-testing=enabled
-# this should not be needed, but something in the tests is setting this to 1234 and confusing the test framework, so set it here to match
-quarkus.http.non-application-root-path=1234
\ No newline at end of file
+quarkus.test.continuous-testing=enabled
\ No newline at end of file
diff --git a/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-template-from-extension/src/main/resources/application.properties b/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-template-from-extension/src/main/resources/application.properties
index 8d698e657885b..442095ca8410c 100644
--- a/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-template-from-extension/src/main/resources/application.properties
+++ b/integration-tests/test-extension/tests/src/test/resources-filtered/projects/project-using-test-template-from-extension/src/main/resources/application.properties
@@ -1,3 +1 @@
-quarkus.test.continuous-testing=enabled
-# this should not be needed, but something in the tests is setting this to 1234 and confusing the test framework, so set it here to match
-quarkus.http.non-application-root-path=1234
\ No newline at end of file
+quarkus.test.continuous-testing=enabled
\ No newline at end of file
diff --git a/test-framework/common/src/main/java/io/quarkus/test/common/LauncherUtil.java b/test-framework/common/src/main/java/io/quarkus/test/common/LauncherUtil.java
index 22a4ed3fcca75..63c687909ef0b 100644
--- a/test-framework/common/src/main/java/io/quarkus/test/common/LauncherUtil.java
+++ b/test-framework/common/src/main/java/io/quarkus/test/common/LauncherUtil.java
@@ -22,13 +22,10 @@
import java.util.regex.Pattern;
import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.ConfigProvider;
-import io.quarkus.runtime.LaunchMode;
-import io.quarkus.runtime.configuration.ConfigUtils;
-import io.quarkus.runtime.configuration.QuarkusConfigFactory;
import io.quarkus.test.common.http.TestHTTPResourceManager;
import io.quarkus.utilities.OS;
-import io.smallrye.config.SmallRyeConfig;
public final class LauncherUtil {
@@ -38,9 +35,7 @@ private LauncherUtil() {
}
public static Config installAndGetSomeConfig() {
- SmallRyeConfig config = ConfigUtils.configBuilder(false, LaunchMode.NORMAL).build();
- QuarkusConfigFactory.setConfig(config);
- return config;
+ return ConfigProvider.getConfig();
}
/**
diff --git a/test-framework/common/src/main/java/io/quarkus/test/common/TestResourceManager.java b/test-framework/common/src/main/java/io/quarkus/test/common/TestResourceManager.java
index d5f606290bebe..176751c654bf4 100644
--- a/test-framework/common/src/main/java/io/quarkus/test/common/TestResourceManager.java
+++ b/test-framework/common/src/main/java/io/quarkus/test/common/TestResourceManager.java
@@ -38,8 +38,6 @@
import org.jboss.jandex.DotName;
import org.jboss.jandex.IndexView;
-import io.smallrye.config.SmallRyeConfigProviderResolver;
-
/**
* Manages {@link QuarkusTestResourceLifecycleManager}
*/
@@ -214,18 +212,6 @@ public void close() {
throw new RuntimeException("Unable to stop Quarkus test resource " + entry.getTestResource(), e);
}
}
- // TODO using QuarkusConfigFactory.setConfig(null) here makes continuous testing fail,
- // e.g. in io.quarkus.hibernate.orm.HibernateHotReloadTestCase
- // or io.quarkus.opentelemetry.deployment.OpenTelemetryContinuousTestingTest;
- // maybe this cleanup is not really necessary and just "doesn't hurt" because
- // the released config is still cached in QuarkusConfigFactory#config
- // and will be restored soon after when QuarkusConfigFactory#getConfigFor is called?
- // In that case we should remove this cleanup.
- try {
- ((SmallRyeConfigProviderResolver) SmallRyeConfigProviderResolver.instance())
- .releaseConfig(Thread.currentThread().getContextClassLoader());
- } catch (Throwable ignored) {
- }
configProperties.clear();
}
diff --git a/test-framework/junit5-config/pom.xml b/test-framework/junit5-config/pom.xml
new file mode 100644
index 0000000000000..9e5a21c6e54bb
--- /dev/null
+++ b/test-framework/junit5-config/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+
+ io.quarkus
+ quarkus-test-framework
+ 999-SNAPSHOT
+
+
+ quarkus-junit5-config
+ Quarkus - Test Framework - JUnit 5 Config
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+
+
+ io.smallrye.config
+ smallrye-config
+
+
+ io.quarkus
+ quarkus-core
+
+
+ io.quarkus
+ quarkus-core-deployment
+
+
+
+
diff --git a/test-framework/junit5-config/src/main/java/io/quarkus/test/config/ConfigLauncherSession.java b/test-framework/junit5-config/src/main/java/io/quarkus/test/config/ConfigLauncherSession.java
new file mode 100644
index 0000000000000..32a59806500a6
--- /dev/null
+++ b/test-framework/junit5-config/src/main/java/io/quarkus/test/config/ConfigLauncherSession.java
@@ -0,0 +1,28 @@
+package io.quarkus.test.config;
+
+import org.eclipse.microprofile.config.spi.ConfigProviderResolver;
+import org.junit.platform.launcher.LauncherSession;
+import org.junit.platform.launcher.LauncherSessionListener;
+
+import io.quarkus.runtime.LaunchMode;
+
+/**
+ * A JUnit {@link LauncherSessionListener}, used to register the initial test config. Test set up code can safely call
+ * ConfigProvider.getConfig()
to retrieve an instance of the Quarkus configuration.
+ *
+ * The test config only contains sources known at bootstrap test time. For instance, config sources generated by
+ * Quarkus are not available in the test config.
+ */
+public class ConfigLauncherSession implements LauncherSessionListener {
+ @Override
+ public void launcherSessionOpened(final LauncherSession session) {
+ TestConfigProviderResolver resolver = new TestConfigProviderResolver();
+ ConfigProviderResolver.setInstance(resolver);
+ resolver.getConfig(LaunchMode.TEST);
+ }
+
+ @Override
+ public void launcherSessionClosed(final LauncherSession session) {
+ ((TestConfigProviderResolver) ConfigProviderResolver.instance()).restore();
+ }
+}
diff --git a/test-framework/junit5-config/src/main/java/io/quarkus/test/config/LoggingSetupExtension.java b/test-framework/junit5-config/src/main/java/io/quarkus/test/config/LoggingSetupExtension.java
new file mode 100644
index 0000000000000..b15c6f8f4e43f
--- /dev/null
+++ b/test-framework/junit5-config/src/main/java/io/quarkus/test/config/LoggingSetupExtension.java
@@ -0,0 +1,17 @@
+package io.quarkus.test.config;
+
+import org.junit.jupiter.api.extension.Extension;
+
+import io.quarkus.runtime.logging.LoggingSetupRecorder;
+
+/**
+ * A global JUnit extension that enables/sets up basic logging if logging has not already been set up.
+ *
+ * This is useful for getting log output from non-Quarkus tests (if executed separately or before the first Quarkus
+ * test), but also for getting instant log output from {@code QuarkusTestResourceLifecycleManagers} etc.
+ */
+public class LoggingSetupExtension implements Extension {
+ public LoggingSetupExtension() {
+ LoggingSetupRecorder.handleFailedStart();
+ }
+}
diff --git a/test-framework/junit5-config/src/main/java/io/quarkus/test/config/QuarkusClassOrderer.java b/test-framework/junit5-config/src/main/java/io/quarkus/test/config/QuarkusClassOrderer.java
new file mode 100644
index 0000000000000..857c13a842548
--- /dev/null
+++ b/test-framework/junit5-config/src/main/java/io/quarkus/test/config/QuarkusClassOrderer.java
@@ -0,0 +1,41 @@
+package io.quarkus.test.config;
+
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.junit.jupiter.api.ClassOrderer;
+import org.junit.jupiter.api.ClassOrdererContext;
+import org.junit.platform.commons.util.ReflectionUtils;
+
+import io.quarkus.deployment.dev.testing.TestConfig;
+import io.smallrye.config.SmallRyeConfig;
+
+/**
+ * A JUnit {@link ClassOrderer}, used to delegate to a custom implementations of {@link ClassOrderer} set by Quarkus
+ * config.
+ */
+public class QuarkusClassOrderer implements ClassOrderer {
+ private final ClassOrderer delegate;
+
+ public QuarkusClassOrderer() {
+ SmallRyeConfig config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
+ TestConfig testConfig = config.getConfigMapping(TestConfig.class);
+
+ delegate = testConfig.classOrderer()
+ .map(klass -> ReflectionUtils.tryToLoadClass(klass)
+ .andThenTry(ReflectionUtils::newInstance)
+ .andThenTry(instance -> (ClassOrderer) instance)
+ .toOptional().orElse(EMPTY))
+ .orElse(EMPTY);
+ }
+
+ @Override
+ public void orderClasses(final ClassOrdererContext context) {
+ delegate.orderClasses(context);
+ }
+
+ private static final ClassOrderer EMPTY = new ClassOrderer() {
+ @Override
+ public void orderClasses(final ClassOrdererContext context) {
+
+ }
+ };
+}
diff --git a/test-framework/junit5-config/src/main/java/io/quarkus/test/config/TestConfigProviderResolver.java b/test-framework/junit5-config/src/main/java/io/quarkus/test/config/TestConfigProviderResolver.java
new file mode 100644
index 0000000000000..9bda00bace7f1
--- /dev/null
+++ b/test-framework/junit5-config/src/main/java/io/quarkus/test/config/TestConfigProviderResolver.java
@@ -0,0 +1,99 @@
+package io.quarkus.test.config;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.spi.ConfigProviderResolver;
+
+import io.quarkus.deployment.dev.testing.TestConfig;
+import io.quarkus.runtime.LaunchMode;
+import io.quarkus.runtime.configuration.ConfigUtils;
+import io.smallrye.config.SmallRyeConfig;
+import io.smallrye.config.SmallRyeConfigBuilder;
+import io.smallrye.config.SmallRyeConfigProviderResolver;
+
+/**
+ * A {@link org.eclipse.microprofile.config.spi.ConfigProviderResolver} to register {@link Config} in the Test
+ * classloader.
+ */
+public class TestConfigProviderResolver extends SmallRyeConfigProviderResolver {
+ private final SmallRyeConfigProviderResolver resolver;
+ private final ClassLoader classLoader;
+ private final Map configs;
+
+ TestConfigProviderResolver() {
+ this.resolver = (SmallRyeConfigProviderResolver) SmallRyeConfigProviderResolver.instance();
+ this.classLoader = Thread.currentThread().getContextClassLoader();
+ this.configs = new ConcurrentHashMap<>();
+ }
+
+ @Override
+ public Config getConfig() {
+ return resolver.getConfig();
+ }
+
+ /**
+ * Registers a config in the Test classloader, by {@link LaunchMode}. Required for tests that launch Quarkus in
+ * Dev mode (which uses the dev
config profile, instead of test
.
+ *
+ * Retrieving the {@link Config} in a {@link LaunchMode} other than {@link LaunchMode#TEST}, must call
+ * {@link TestConfigProviderResolver#restoreConfig()} after using the config, to avoid mismatches in the config
+ * profile through the stack.
+ *
+ * @param mode the {@link LaunchMode}
+ * @return the registed {@link Config} instance
+ */
+ public Config getConfig(final LaunchMode mode) {
+ if (classLoader.equals(Thread.currentThread().getContextClassLoader())) {
+ resolver.releaseConfig(classLoader);
+ SmallRyeConfig config = configs.computeIfAbsent(mode, new Function() {
+ @Override
+ public SmallRyeConfig apply(final LaunchMode launchMode) {
+ return ConfigUtils.configBuilder(false, true, mode)
+ .withProfile(mode.getDefaultProfile())
+ .withMapping(TestConfig.class, "quarkus.test")
+ .build();
+ }
+ });
+ resolver.registerConfig(config, classLoader);
+ return config;
+ }
+ throw new IllegalStateException();
+ }
+
+ public void restoreConfig() {
+ if (classLoader.equals(Thread.currentThread().getContextClassLoader())) {
+ resolver.releaseConfig(classLoader);
+ resolver.registerConfig(configs.get(LaunchMode.TEST), classLoader);
+ } else {
+ throw new IllegalStateException();
+ }
+ }
+
+ public void restore() {
+ this.configs.clear();
+ ConfigProviderResolver.setInstance(resolver);
+ }
+
+ @Override
+ public Config getConfig(final ClassLoader loader) {
+ return resolver.getConfig(loader);
+ }
+
+ @Override
+ public SmallRyeConfigBuilder getBuilder() {
+ return resolver.getBuilder();
+ }
+
+ @Override
+ public void registerConfig(final Config config, final ClassLoader classLoader) {
+ resolver.registerConfig(config, classLoader);
+ }
+
+ @Override
+ public void releaseConfig(final Config config) {
+ resolver.releaseConfig(config);
+ }
+}
diff --git a/test-framework/junit5-config/src/main/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/test-framework/junit5-config/src/main/resources/META-INF/services/org.junit.jupiter.api.extension.Extension
new file mode 100644
index 0000000000000..a91b69862a876
--- /dev/null
+++ b/test-framework/junit5-config/src/main/resources/META-INF/services/org.junit.jupiter.api.extension.Extension
@@ -0,0 +1 @@
+io.quarkus.test.config.LoggingSetupExtension
diff --git a/test-framework/junit5-config/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener b/test-framework/junit5-config/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener
new file mode 100644
index 0000000000000..ca3c61a72cde2
--- /dev/null
+++ b/test-framework/junit5-config/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener
@@ -0,0 +1 @@
+io.quarkus.test.config.ConfigLauncherSession
diff --git a/test-framework/junit5-config/src/main/resources/junit-platform.properties b/test-framework/junit5-config/src/main/resources/junit-platform.properties
new file mode 100644
index 0000000000000..d24c3ed5820f5
--- /dev/null
+++ b/test-framework/junit5-config/src/main/resources/junit-platform.properties
@@ -0,0 +1,2 @@
+junit.jupiter.extensions.autodetection.enabled=true
+junit.jupiter.testclass.order.default=io.quarkus.test.config.QuarkusClassOrderer
diff --git a/test-framework/junit5-internal/pom.xml b/test-framework/junit5-internal/pom.xml
index 526869cab070b..9bd5cf5b47f47 100644
--- a/test-framework/junit5-internal/pom.xml
+++ b/test-framework/junit5-internal/pom.xml
@@ -39,6 +39,10 @@
junit-jupiter-engine
compile