diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/CachingJupiterConfiguration.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/CachingJupiterConfiguration.java index f2e24ba494dc..9f05ce558b20 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/CachingJupiterConfiguration.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/CachingJupiterConfiguration.java @@ -46,6 +46,16 @@ public CachingJupiterConfiguration(JupiterConfiguration delegate) { this.delegate = delegate; } + @Override + public Optional getExtensionAutodetectionIncludePattern() { + return delegate.getExtensionAutodetectionIncludePattern(); + } + + @Override + public Optional getExtensionAutodetectionExcludePattern() { + return delegate.getExtensionAutodetectionExcludePattern(); + } + @Override public Optional getRawConfigurationParameter(String key) { return delegate.getRawConfigurationParameter(key); diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/DefaultJupiterConfiguration.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/DefaultJupiterConfiguration.java index b72b0362e638..03f90542a714 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/DefaultJupiterConfiguration.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/DefaultJupiterConfiguration.java @@ -73,6 +73,16 @@ public DefaultJupiterConfiguration(ConfigurationParameters configurationParamete "ConfigurationParameters must not be null"); } + @Override + public Optional getExtensionAutodetectionIncludePattern() { + return configurationParameters.get(EXTENSIONS_AUTODETECTION_INCLUDE_PROPERTY_NAME); + } + + @Override + public Optional getExtensionAutodetectionExcludePattern() { + return configurationParameters.get(EXTENSIONS_AUTODETECTION_EXCLUDE_PROPERTY_NAME); + } + @Override public Optional getRawConfigurationParameter(String key) { return configurationParameters.get(key); diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/JupiterConfiguration.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/JupiterConfiguration.java index b342054c5cbf..a90ece7beedb 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/JupiterConfiguration.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/config/JupiterConfiguration.java @@ -36,6 +36,8 @@ @API(status = INTERNAL, since = "5.4") public interface JupiterConfiguration { + String EXTENSIONS_AUTODETECTION_INCLUDE_PROPERTY_NAME = "junit.jupiter.extensions.autodetection.include"; + String EXTENSIONS_AUTODETECTION_EXCLUDE_PROPERTY_NAME = "junit.jupiter.extensions.autodetection.exclude"; String DEACTIVATE_CONDITIONS_PATTERN_PROPERTY_NAME = "junit.jupiter.conditions.deactivate"; String PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME = "junit.jupiter.execution.parallel.enabled"; String DEFAULT_EXECUTION_MODE_PROPERTY_NAME = Execution.DEFAULT_EXECUTION_MODE_PROPERTY_NAME; @@ -48,6 +50,10 @@ public interface JupiterConfiguration { String DEFAULT_TEST_CLASS_ORDER_PROPERTY_NAME = ClassOrderer.DEFAULT_ORDER_PROPERTY_NAME;; String DEFAULT_TEST_INSTANTIATION_EXTENSION_CONTEXT_SCOPE_PROPERTY_NAME = ExtensionContextScope.DEFAULT_SCOPE_PROPERTY_NAME; + Optional getExtensionAutodetectionIncludePattern(); + + Optional getExtensionAutodetectionExcludePattern(); + Optional getRawConfigurationParameter(String key); Optional getRawConfigurationParameter(String key, Function transformer); diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java index 676598c7abe0..7a31091fbfde 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java @@ -28,6 +28,7 @@ import java.util.ServiceLoader; import java.util.Set; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Stream; import org.apiguardian.api.API; @@ -37,6 +38,7 @@ import org.junit.platform.commons.logging.LoggerFactory; import org.junit.platform.commons.support.ReflectionSupport; import org.junit.platform.commons.util.ClassLoaderUtils; +import org.junit.platform.commons.util.ClassNamePatternFilterUtils; import org.junit.platform.commons.util.Preconditions; /** @@ -83,7 +85,7 @@ public static MutableExtensionRegistry createRegistryWithDefaultExtensions(Jupit extensionRegistry.registerDefaultExtension(new TempDirectory(configuration)); if (configuration.isExtensionAutoDetectionEnabled()) { - registerAutoDetectedExtensions(extensionRegistry); + registerAutoDetectedExtensions(extensionRegistry, configuration); } if (configuration.isThreadDumpOnTimeoutEnabled()) { @@ -93,9 +95,23 @@ public static MutableExtensionRegistry createRegistryWithDefaultExtensions(Jupit return extensionRegistry; } - private static void registerAutoDetectedExtensions(MutableExtensionRegistry extensionRegistry) { + private static void registerAutoDetectedExtensions(MutableExtensionRegistry extensionRegistry, + JupiterConfiguration configuration) { + Predicate filter = createExtensionFilterByPatterns( + configuration.getExtensionAutodetectionIncludePattern().orElse("*"), + configuration.getExtensionAutodetectionExcludePattern().orElse("")); + ServiceLoader.load(Extension.class, ClassLoaderUtils.getDefaultClassLoader())// - .forEach(extensionRegistry::registerAutoDetectedExtension); + .forEach(extension -> { + if (filter.test(extension.getClass().getName())) { + extensionRegistry.registerAutoDetectedExtension(extension); + } + }); + } + + private static Predicate createExtensionFilterByPatterns(String include, String exclude) { + return ClassNamePatternFilterUtils.includeMatchingClassNames(include).and( + ClassNamePatternFilterUtils.excludeMatchingClassNames(exclude)); } /**