Commit 6d6bbfb7 authored by Madhura Bhave's avatar Madhura Bhave

Merge pull request #19556 from scottfrederick

* pr/19556:
  Add profiles directly to the application environment for tests

Closes gh-19556
parents d46406fc 487b9cbf
...@@ -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