Commit 487b9cbf authored by Scott Frederick's avatar Scott Frederick Committed by Madhura Bhave

Add profiles directly to the application environment for tests

Prior to this commit, active profiles were being added to the Spring Boot
application environment by setting the `spring.profiles.active` property.
This could result in profiles getting parsed differently than other uses of `@ActiveProfiles`.
Setting the profiles directly in the `Environment` prevents this parsing.

See gh-19556
parent d46406fc
...@@ -28,7 +28,6 @@ import org.springframework.boot.context.properties.bind.Binder; ...@@ -28,7 +28,6 @@ import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.context.properties.source.ConfigurationPropertySource; import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource; import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
import org.springframework.boot.test.mock.web.SpringBootMockServletContext; import org.springframework.boot.test.mock.web.SpringBootMockServletContext;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.web.reactive.context.GenericReactiveWebApplicationContext; import org.springframework.boot.web.reactive.context.GenericReactiveWebApplicationContext;
import org.springframework.boot.web.servlet.support.ServletContextApplicationContextInitializer; import org.springframework.boot.web.servlet.support.ServletContextApplicationContextInitializer;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
...@@ -73,6 +72,7 @@ import org.springframework.web.context.support.GenericWebApplicationContext; ...@@ -73,6 +72,7 @@ import org.springframework.web.context.support.GenericWebApplicationContext;
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Madhura Bhave * @author Madhura Bhave
* @author Scott Frederick
* @since 1.4.0 * @since 1.4.0
* @see SpringBootTest * @see SpringBootTest
*/ */
...@@ -92,7 +92,7 @@ public class SpringBootContextLoader extends AbstractContextLoader { ...@@ -92,7 +92,7 @@ public class SpringBootContextLoader extends AbstractContextLoader {
application.getSources().addAll(Arrays.asList(configLocations)); application.getSources().addAll(Arrays.asList(configLocations));
ConfigurableEnvironment environment = getEnvironment(); ConfigurableEnvironment environment = getEnvironment();
if (!ObjectUtils.isEmpty(config.getActiveProfiles())) { if (!ObjectUtils.isEmpty(config.getActiveProfiles())) {
setActiveProfiles(environment, config.getActiveProfiles()); environment.setActiveProfiles(config.getActiveProfiles());
} }
ResourceLoader resourceLoader = (application.getResourceLoader() != null) ? application.getResourceLoader() ResourceLoader resourceLoader = (application.getResourceLoader() != null) ? application.getResourceLoader()
: new DefaultResourceLoader(getClass().getClassLoader()); : new DefaultResourceLoader(getClass().getClassLoader());
...@@ -138,11 +138,6 @@ public class SpringBootContextLoader extends AbstractContextLoader { ...@@ -138,11 +138,6 @@ public class SpringBootContextLoader extends AbstractContextLoader {
return new StandardEnvironment(); return new StandardEnvironment();
} }
private void setActiveProfiles(ConfigurableEnvironment environment, String[] profiles) {
TestPropertyValues.of("spring.profiles.active=" + StringUtils.arrayToCommaDelimitedString(profiles))
.applyTo(environment);
}
protected String[] getInlinedProperties(MergedContextConfiguration config) { protected String[] getInlinedProperties(MergedContextConfiguration config) {
ArrayList<String> properties = new ArrayList<>(); ArrayList<String> properties = new ArrayList<>();
// JMX bean names will clash if the same bean is used in multiple contexts // JMX bean names will clash if the same bean is used in multiple contexts
......
...@@ -22,6 +22,8 @@ import org.junit.Ignore; ...@@ -22,6 +22,8 @@ import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.MergedContextConfiguration;
import org.springframework.test.context.TestContext; import org.springframework.test.context.TestContext;
...@@ -35,6 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -35,6 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link SpringBootContextLoader} * Tests for {@link SpringBootContextLoader}
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Scott Frederick
*/ */
public class SpringBootContextLoaderTests { public class SpringBootContextLoaderTests {
...@@ -88,13 +91,40 @@ public class SpringBootContextLoaderTests { ...@@ -88,13 +91,40 @@ public class SpringBootContextLoaderTests {
assertKey(config, "variables", "foo=FOO\n bar=BAR"); assertKey(config, "variables", "foo=FOO\n bar=BAR");
} }
@Test
public void noActiveProfiles() {
Environment environment = getApplicationEnvironment(SimpleConfig.class);
assertThat(environment.getActiveProfiles()).isEmpty();
}
@Test
public void multipleActiveProfiles() {
Environment environment = getApplicationEnvironment(MultipleActiveProfiles.class);
assertThat(environment.getActiveProfiles()).containsExactly("profile1", "profile2");
}
@Test
public void activeProfileWithComma() {
Environment environment = getApplicationEnvironment(ActiveProfileWithComma.class);
assertThat(environment.getActiveProfiles()).containsExactly("profile1,2");
}
private Map<String, Object> getEnvironmentProperties(Class<?> testClass) { private Map<String, Object> getEnvironmentProperties(Class<?> testClass) {
TestContext context = new ExposedTestContextManager(testClass).getExposedTestContext(); TestContext context = getTestContext(testClass);
MergedContextConfiguration config = (MergedContextConfiguration) ReflectionTestUtils.getField(context, MergedContextConfiguration config = (MergedContextConfiguration) ReflectionTestUtils.getField(context,
"mergedContextConfiguration"); "mergedContextConfiguration");
return TestPropertySourceUtils.convertInlinedPropertiesToMap(config.getPropertySourceProperties()); return TestPropertySourceUtils.convertInlinedPropertiesToMap(config.getPropertySourceProperties());
} }
private Environment getApplicationEnvironment(Class<?> testClass) {
TestContext context = getTestContext(testClass);
return context.getApplicationContext().getEnvironment();
}
private TestContext getTestContext(Class<?> testClass) {
return new ExposedTestContextManager(testClass).getExposedTestContext();
}
private void assertKey(Map<String, Object> actual, String key, Object value) { private void assertKey(Map<String, Object> actual, String key, Object value) {
assertThat(actual.containsKey(key)).as("Key '" + key + "' not found").isTrue(); assertThat(actual.containsKey(key)).as("Key '" + key + "' not found").isTrue();
assertThat(actual.get(key)).isEqualTo(value); assertThat(actual.get(key)).isEqualTo(value);
...@@ -142,6 +172,20 @@ public class SpringBootContextLoaderTests { ...@@ -142,6 +172,20 @@ public class SpringBootContextLoaderTests {
} }
@SpringBootTest
@ActiveProfiles({ "profile1", "profile2" })
@ContextConfiguration(classes = Config.class)
static class MultipleActiveProfiles {
}
@SpringBootTest
@ActiveProfiles({ "profile1,2" })
@ContextConfiguration(classes = Config.class)
static class ActiveProfileWithComma {
}
@Configuration @Configuration
static class Config { static class Config {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment