From 7e6bad8d4b4e6aeebe974d6aff2b9713539504e6 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 3 Sep 2014 15:01:52 -0700 Subject: [PATCH] Fix @ActiveProfile to override existing profiles Change SpringApplicationContextLoader to set active profiles using the `spring.profiles.active` environment property rather than calling `SpringApplication.setAdditionalProfiles`. This allows @ActiveProfiles to replace existing profiles rather than add to them which is consistent with the Spring TestContext Framework. Fixes gh-1469 --- .../test/SpringApplicationContextLoader.java | 10 +++- ...cationConfigurationActiveProfileTests.java | 55 +++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationConfigurationActiveProfileTests.java diff --git a/spring-boot/src/main/java/org/springframework/boot/test/SpringApplicationContextLoader.java b/spring-boot/src/main/java/org/springframework/boot/test/SpringApplicationContextLoader.java index 8aa430d244..e1057f9fe0 100644 --- a/spring-boot/src/main/java/org/springframework/boot/test/SpringApplicationContextLoader.java +++ b/spring-boot/src/main/java/org/springframework/boot/test/SpringApplicationContextLoader.java @@ -48,6 +48,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoaderUti import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebMergedContextConfiguration; import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; import org.springframework.web.context.support.GenericWebApplicationContext; import org.springframework.web.context.support.StandardServletEnvironment; @@ -80,13 +81,16 @@ public class SpringApplicationContextLoader extends AbstractContextLoader { throws Exception { SpringApplication application = getSpringApplication(); application.setSources(getSources(config)); - if (!ObjectUtils.isEmpty(config.getActiveProfiles())) { - application.setAdditionalProfiles(config.getActiveProfiles()); - } ConfigurableEnvironment environment = new StandardEnvironment(); if (config instanceof WebMergedContextConfiguration) { environment = new StandardServletEnvironment(); } + if (!ObjectUtils.isEmpty(config.getActiveProfiles())) { + String profiles = StringUtils.arrayToCommaDelimitedString(config + .getActiveProfiles()); + EnvironmentTestUtils.addEnvironment(environment, "spring.profiles.active=" + + profiles); + } // Ensure @IntegrationTest properties go before external config and after system environment.getPropertySources() .addAfter( diff --git a/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationConfigurationActiveProfileTests.java b/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationConfigurationActiveProfileTests.java new file mode 100644 index 0000000000..a15298d2f4 --- /dev/null +++ b/spring-boot/src/test/java/org/springframework/boot/test/SpringApplicationConfigurationActiveProfileTests.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * Tests for {@link SpringApplicationContextLoader} with active profiles. See gh-1469. + * + * @author Phillip Webb + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration +@IntegrationTest("spring.config.name=enableother") +@ActiveProfiles("override") +public class SpringApplicationConfigurationActiveProfileTests { + + @Autowired + private ApplicationContext context; + + @Test + public void profiles() throws Exception { + assertThat(this.context.getEnvironment().getActiveProfiles(), + equalTo(new String[] { "override" })); + } + + @Configuration + protected static class Config { + + } + +}