Spring Testing - Context Configuration Inheritance

[Updated: Jul 9, 2017, Created: Jul 8, 2017]

@ContextConfiguration annotation has 'inheritLocations' and 'inheritInitializers' elements which specify whether configuration locations (config classes/resources) and context initializers declared by superclasses should be inherited. By default both flags are true. That means a test subclass inherits both the config locations as well as the context initializers declared by any superclasses. Let's understand that with examples.

Using default i.e. inheritLocations=true and inheritInitializers=true

A Spring application

@Service
public interface CustomerService {
  String getCustomerById(String id);
}
@Service
public interface OrderService {
  String getOrdersForCustomer(String customerId);
}
@Configuration
public class AppConfig {
  @Bean
  public CustomerService customerService() {
      return new CustomerService() {
          @Override
          public String getCustomerById(String id) {
              return "Customer " + id;
          }
      };
  }
}
@Configuration
public class AppConfigExtended {
  @Bean
  public OrderService orderService() {
      return new OrderService() {
          @Override
          public String getOrdersForCustomer(String customerId) {
              return "orders for customer " + customerId;
          }
      };
  }
}

The Test classes

@ContextConfiguration(classes = AppConfig.class,
      initializers = MyContextInitializer.class)
public class BaseServiceTests {

  @Autowired
  private CustomerService customerService;

  @Test
  public void testCustomerById() {
      String customer = customerService.getCustomerById("323");
      System.out.println("-- CustomerById test --");
      System.out.println(customer);
      Assert.notNull(customer, "customer is null for id 323");
  }
}
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = AppConfigExtended.class)
public class ExtendedServiceTests extends BaseServiceTests {

  @Autowired
  private OrderService orderService;

  @Test
  public void testOrderCustomer() {
      String orders = orderService.getOrdersForCustomer("323");
      System.out.println("-- OrdersByCustomer test --");
      System.out.println(orders);
      Assert.notNull(orders, "Orders is null for id 323");
  }
}
public class MyContextInitializer implements
      ApplicationContextInitializer<ConfigurableApplicationContext> {

  @Override
  public void initialize(ConfigurableApplicationContext ac) {
      System.out.println("-- in context initializer --");
  }
}
mvn -q test -Dtest=ExtendedServiceTests

Output

D:\example-projects\spring-core-testing\context-configuration-inheritance-example>mvn -q test -Dtest=ExtendedServiceTests

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.logicbig.example.ExtendedServiceTests
-- in context initializer --
-- OrdersByCustomer test --
orders for customer 323
-- CustomerById test --
Customer 323
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.357 sec

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

Turning off inheritLocations

With the same above Spring application, let's don't inherit config locations (the config class) from the super class by setting inheritLocations=false. We will also provide an alternative configuration which will replace the super class's one.

@ContextConfiguration(inheritLocations = false,
      classes = {
              AppConfigExtended.class, OtherAppConfig.class
      })

public class ExtendedServiceTests extends BaseServiceTests {

  @Autowired
  private OrderService orderService;
    .............
}
@Configuration
public class OtherAppConfig {
  @Bean
  public CustomerService customerService() {
      return new CustomerService() {
          @Override
          public String getCustomerById(String id) {
              return "Other Customer " + id;
          }
      };
  }
}
mvn -q test -Dtest=ExtendedServiceTests

Output

D:\example-projects\spring-core-testing\context-configuration-inheritance-example>mvn -q test -Dtest=ExtendedServiceTests

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.logicbig.example.ExtendedServiceTests
-- in context initializer --
-- OrdersByCustomer test --
orders for customer 323
-- CustomerById test --
Other Customer 323
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.36 sec

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

Example Project

Dependencies and Technologies Used :

  • spring-context 4.3.8.RELEASE: Spring Context.
  • spring-test 4.3.9.RELEASE: Spring TestContext Framework.
  • junit 4.12: JUnit is a unit testing framework for Java, created by Erich Gamma and Kent Beck.
  • JDK 1.8
  • Maven 3.3.9

Context Configuration Inheritance Example Select All Download
  • context-configuration-inheritance-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
      • test
        • java
          • com
            • logicbig
              • example

See Also