Description
Sam Brannen opened SPR-7960 and commented
Overview
Spring 3.1 introduces support for bean definition profiles, such as 'production', 'dev', etc.
The Spring TestContext framework should be extended to support declarative configuration of bean definition profiles on a per-ApplicationContext basis.
One option would be to provide an attribute in the @ContextConfiguration
annotation to allow the spring.profiles.active
value to be set declaratively.
Further Resources
Example Tests Using @ActiveProfiles
The following examples -- which are taken from the Spring test suite -- show how to declare which active profiles to use when loading an application context via the new @ActiveProfiles
annotation.
Testing Active Profiles with @Configuration
Classes
\
DefaultProfileConfig
:@Configuration
class without a@Profile
declarationDevProfileConfig
:@Configuration
class with a@Profile("dev")
declarationDefaultProfileAnnotationConfigTests
: JUnit 4 test that instructs the TestContext framework to load an application context from both theDefaultProfileConfig
andDevProfileConfig
@Configuration
classesDevProfileAnnotationConfigTests
: extendsDefaultProfileAnnotationConfigTests
and instructs the TestContext framework to activate the "dev" profile via@ActiveProfiles("dev")
Note that the autowired employee
is null
in DefaultProfileAnnotationConfigTests
but not null
in DevProfileAnnotationConfigTests
; whereas, the pet
is non-null for both the default and dev profile.
@Configuration
public class DefaultProfileConfig {
@Bean
public Pet pet() {
return new Pet("Fido");
}
}
\
@Profile("dev")
@Configuration
public class DevProfileConfig {
@Bean
public Employee employee() {
Employee employee = new Employee();
employee.setName("John Smith");
employee.setAge(42);
employee.setCompany("Acme Widgets, Inc.");
return employee;
}
}
\
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { DefaultProfileConfig.class, DevProfileConfig.class },
loader = AnnotationConfigContextLoader.class)
public class DefaultProfileAnnotationConfigTests {
@Autowired
protected Pet pet;
@Autowired(required = false)
protected Employee employee;
@Test
public void pet() {
assertNotNull(pet);
assertEquals("Fido", pet.getName());
}
@Test
public void employee() {
assertNull("employee bean should not be created for the default profile", employee);
}
}
\
@ActiveProfiles("dev")
public class DevProfileAnnotationConfigTests extends DefaultProfileAnnotationConfigTests {
@Test
@Override
public void employee() {
assertNotNull("employee bean should be loaded for the 'dev' profile", employee);
assertEquals("John Smith", employee.getName());
}
}
Testing Active Profiles with XML Configuration
\
The DefaultProfileXmlConfigTests
and DevProfileXmlConfigTests
classes are analogous to the DefaultProfileAnnotationConfigTests
and DevProfileAnnotationConfigTests
classes described above. The difference is that both of these test classes use the XML-based configuration found in DefaultProfileXmlConfigTests-context.xml
, which combines the declaration of the default and dev profiles in a single XML file. Otherwise, the use of @ActiveProfiles
and the behavior of the tests is identical.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="pet" class="org.springframework.beans.Pet">
<constructor-arg value="Fido" />
</bean>
<beans profile="dev">
<bean id="employee" class="org.springframework.beans.Employee">
<property name="name" value="John Smith" />
<property name="age" value="42" />
<property name="company" value="Acme Widgets, Inc." />
</bean>
</beans>
</beans>
\
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class DefaultProfileXmlConfigTests {
@Autowired
protected Pet pet;
@Autowired(required = false)
protected Employee employee;
@Test
public void pet() {
assertNotNull(pet);
assertEquals("Fido", pet.getName());
}
@Test
public void employee() {
assertNull("employee bean should not be created for the default profile", employee);
}
}
\
@ActiveProfiles("dev")
public class DevProfileXmlConfigTests extends DefaultProfileXmlConfigTests {
@Test
@Override
public void employee() {
assertNotNull("employee bean should be loaded for the 'dev' profile", employee);
assertEquals("John Smith", employee.getName());
}
}
Affects: 3.1 M1
Issue Links:
- Introduce SmartContextLoader SPI [SPR-8386] #13033 Introduce SmartContextLoader SPI ("depends on")
- Decide what to do with
@IfProfileValue
[SPR-7754] #12410 Decide what to do with@IfProfileValue
- Provide TestContext support for @Configuration classes [SPR-6184] #10852 Provide TestContext support for
@Configuration
classes - Introduce strategy for determining if a profile value is enabled for a particular test environment [SPR-4862] #9538 Introduce strategy for determining if a profile value is enabled for a particular test environment
5 votes, 6 watchers