Uploaded image for project: 'Spring Framework'
  1. Spring Framework
  2. SPR-7960

TestContext framework should support declarative configuration of bean definition profiles

    Details

    • Type: New Feature
    • Status: Closed
    • Priority: Critical
    • Resolution: Complete
    • Affects Version/s: 3.1 M1
    • Fix Version/s: 3.1 M2
    • Component/s: Test
    • Labels:
      None
    • Last commented by a User:
      false

      Description

      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 declaration
      • DevProfileConfig: @Configuration class with a @Profile("dev") declaration
      • DefaultProfileAnnotationConfigTests: JUnit 4 test that instructs the TestContext framework to load an application context from both the DefaultProfileConfig and DevProfileConfig @Configuration classes
      • DevProfileAnnotationConfigTests: extends DefaultProfileAnnotationConfigTests 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.

      DefaultProfileConfig.java
      @Configuration
      public class DefaultProfileConfig {
      
      	@Bean
      	public Pet pet() {
      		return new Pet("Fido");
      	}
      }
      


      DevProfileConfig.java
      @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;
      	}
      }
      


      DefaultProfileAnnotationConfigTests.java
      @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);
      	}
      }
      


      DevProfileAnnotationConfigTests.java
      @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.

      DefaultProfileXmlConfigTests-context.xml
      <?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>
      


      DefaultProfileXmlConfigTests.java
      @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);
      	}
      }
      


      DevProfileXmlConfigTests.java
      @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());
      	}
      
      }
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                sbrannen Sam Brannen
                Reporter:
                sbrannen Sam Brannen
                Last updater:
                Trevor Marshall
              • Votes:
                5 Vote for this issue
                Watchers:
                6 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:
                  Days since last comment:
                  7 years, 3 weeks, 4 days ago