diff --git a/framework-docs/modules/ROOT/pages/testing/annotations/integration-spring/annotation-activeprofiles.adoc b/framework-docs/modules/ROOT/pages/testing/annotations/integration-spring/annotation-activeprofiles.adoc index 31299b96bd07..572949d30a22 100644 --- a/framework-docs/modules/ROOT/pages/testing/annotations/integration-spring/annotation-activeprofiles.adoc +++ b/framework-docs/modules/ROOT/pages/testing/annotations/integration-spring/annotation-activeprofiles.adoc @@ -72,6 +72,12 @@ bean definition profiles programmatically by implementing a custom xref:testing/testcontext-framework/ctx-management/env-profiles.adoc#testcontext-ctx-management-env-profiles-ActiveProfilesResolver[`ActiveProfilesResolver`] and registering it by using the `resolver` attribute of `@ActiveProfiles`. +NOTE: The `spring.profiles.active` system property is not taken into account by the +Test Context Framework when determining active profiles for a test class. If you need +to override the profiles configured via `@ActiveProfiles`, you can implement a custom +`ActiveProfilesResolver` as described in +xref:testing/testcontext-framework/ctx-management/env-profiles.adoc[Context Configuration with Environment Profiles]. + See xref:testing/testcontext-framework/ctx-management/env-profiles.adoc[Context Configuration with Environment Profiles], xref:testing/testcontext-framework/support-classes.adoc#testcontext-junit-jupiter-nested-test-configuration[`@Nested` test class configuration], and the {spring-framework-api}/test/context/ActiveProfiles.html[`@ActiveProfiles`] javadoc for diff --git a/framework-docs/modules/ROOT/pages/testing/testcontext-framework/ctx-management/env-profiles.adoc b/framework-docs/modules/ROOT/pages/testing/testcontext-framework/ctx-management/env-profiles.adoc index f1d52d53c03a..90595766750a 100644 --- a/framework-docs/modules/ROOT/pages/testing/testcontext-framework/ctx-management/env-profiles.adoc +++ b/framework-docs/modules/ROOT/pages/testing/testcontext-framework/ctx-management/env-profiles.adoc @@ -543,3 +543,74 @@ Kotlin:: ---- ====== +The following example demonstrates how to implement and register a custom +`SystemPropertyActiveProfilesResolver` that allows the `spring.profiles.active` +system property to override profiles configured via `@ActiveProfiles`: + +[tabs] +====== +Java:: ++ +[source,java,indent=0,subs="verbatim,quotes",role="primary"] +---- + // profiles resolved programmatically via a custom resolver that + // allows "spring.profiles.active" to override @ActiveProfiles + @ActiveProfiles( + resolver = SystemPropertyActiveProfilesResolver.class, + inheritProfiles = false) + class TransferServiceTest extends AbstractIntegrationTest { + // test body + } +---- + +Kotlin:: ++ +[source,kotlin,indent=0,subs="verbatim,quotes",role="secondary"] +---- + // profiles resolved programmatically via a custom resolver that + // allows "spring.profiles.active" to override @ActiveProfiles + @ActiveProfiles( + resolver = SystemPropertyActiveProfilesResolver::class, + inheritProfiles = false) + class TransferServiceTest : AbstractIntegrationTest() { + // test body + } +---- +====== + +[tabs] +====== +Java:: ++ +[source,java,indent=0,subs="verbatim,quotes",role="primary"] +---- + public class SystemPropertyActiveProfilesResolver implements ActiveProfilesResolver { + + @Override + public String[] resolve(Class testClass) { + String profiles = System.getProperty("spring.profiles.active"); + if (profiles != null && !profiles.isBlank()) { + return profiles.split(","); + } + return new DefaultActiveProfilesResolver().resolve(testClass); + } + } +---- + +Kotlin:: ++ +[source,kotlin,indent=0,subs="verbatim,quotes",role="secondary"] +---- + class SystemPropertyActiveProfilesResolver : ActiveProfilesResolver { + + override fun resolve(testClass: Class<*>): Array { + val profiles = System.getProperty("spring.profiles.active") + if (!profiles.isNullOrBlank()) { + return profiles.split(",").toTypedArray() + } + return DefaultActiveProfilesResolver().resolve(testClass) + } + } +---- +====== + diff --git a/spring-test/src/main/java/org/springframework/test/context/ActiveProfiles.java b/spring-test/src/main/java/org/springframework/test/context/ActiveProfiles.java index dc5711b7fece..33d477a72cf5 100644 --- a/spring-test/src/main/java/org/springframework/test/context/ActiveProfiles.java +++ b/spring-test/src/main/java/org/springframework/test/context/ActiveProfiles.java @@ -38,6 +38,14 @@ * enclosing test class by default. See * {@link NestedTestConfiguration @NestedTestConfiguration} for details. * + *

Note that the {@code spring.profiles.active} system property is not taken + * into account by the Test Context Framework when determining active profiles for + * a test class. If you need to override the profiles configured via + * {@code @ActiveProfiles}, you can implement a custom {@link ActiveProfilesResolver} + * and register it via the {@link #resolver} attribute. See + * Context Configuration with Environment Profiles in the reference manual + * for further details and examples. + * * @author Sam Brannen * @since 3.1 * @see SmartContextLoader diff --git a/spring-test/src/main/java/org/springframework/test/context/support/DefaultActiveProfilesResolver.java b/spring-test/src/main/java/org/springframework/test/context/support/DefaultActiveProfilesResolver.java index 5f520302083c..e4ba93d06c08 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/DefaultActiveProfilesResolver.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/DefaultActiveProfilesResolver.java @@ -32,6 +32,13 @@ * configured declaratively via {@link ActiveProfiles#profiles} or * {@link ActiveProfiles#value}. * + *

Note that the {@code spring.profiles.active} system property is not taken + * into account by this resolver. If you need to allow the + * {@code spring.profiles.active} system property to override profiles configured + * via {@link ActiveProfiles}, you can implement a custom + * {@link ActiveProfilesResolver} and register it via + * {@link ActiveProfiles#resolver}. + * * @author Sam Brannen * @since 4.1 * @see ActiveProfiles