org.springframework.test.context.support

Class AbstractDelegatingSmartContextLoader

  • java.lang.Object
    • org.springframework.test.context.support.AbstractDelegatingSmartContextLoader
  • All Implemented Interfaces:
    ContextLoader, SmartContextLoader
    Direct Known Subclasses:
    DelegatingSmartContextLoader, WebDelegatingSmartContextLoader


    public abstract class AbstractDelegatingSmartContextLoader
    extends java.lang.Object
    implements SmartContextLoader
    AbstractDelegatingSmartContextLoader serves as an abstract base class for implementations of the SmartContextLoader SPI that delegate to a set of candidate SmartContextLoaders (i.e., one that supports XML configuration files or Groovy scripts and one that supports annotated classes) to determine which context loader is appropriate for a given test class's configuration. Each candidate is given a chance to process the ContextConfigurationAttributes for each class in the test class hierarchy that is annotated with @ContextConfiguration, and the candidate that supports the merged, processed configuration will be used to actually load the context.

    Any reference to an XML-based loader can be interpreted to mean a context loader that supports only XML configuration files or one that supports both XML configuration files and Groovy scripts simultaneously.

    Placing an empty @ContextConfiguration annotation on a test class signals that default resource locations (e.g., XML configuration files or Groovy scripts) or default configuration classes should be detected. Furthermore, if a specific ContextLoader or SmartContextLoader is not explicitly declared via @ContextConfiguration, a concrete subclass of AbstractDelegatingSmartContextLoader will be used as the default loader, thus providing automatic support for either path-based resource locations (e.g., XML configuration files and Groovy scripts) or annotated classes, but not both simultaneously.

    As of Spring 3.2, a test class may optionally declare neither path-based resource locations nor annotated classes and instead declare only application context initializers. In such cases, an attempt will still be made to detect defaults, but their absence will not result in an exception.

    Since:
    3.2
    Author:
    Sam Brannen, Phillip Webb
    See Also:
    SmartContextLoader
    • Constructor Detail

      • AbstractDelegatingSmartContextLoader

        public AbstractDelegatingSmartContextLoader()
    • Method Detail

      • getXmlLoader

        protected abstract SmartContextLoader getXmlLoader()
        Get the delegate SmartContextLoader that supports XML configuration files and/or Groovy scripts.
      • getAnnotationConfigLoader

        protected abstract SmartContextLoader getAnnotationConfigLoader()
        Get the delegate SmartContextLoader that supports annotated classes.
      • processLocations

        public final java.lang.String[] processLocations(java.lang.Class<?> clazz,
                                                         @Nullable
                                                         java.lang.String... locations)
        AbstractDelegatingSmartContextLoader does not support the ContextLoader.processLocations(Class, String...) method. Call processContextConfiguration(ContextConfigurationAttributes) instead.
        Specified by:
        processLocations in interface ContextLoader
        Parameters:
        clazz - the class with which the locations are associated: used to determine how to process the supplied locations
        locations - the unmodified locations to use for loading the application context (can be null or empty)
        Returns:
        an array of application context resource locations
        Throws:
        java.lang.UnsupportedOperationException - in this implementation
      • processContextConfiguration

        public void processContextConfiguration(ContextConfigurationAttributes configAttributes)
        Delegates to candidate SmartContextLoaders to process the supplied ContextConfigurationAttributes.

        Delegation is based on explicit knowledge of the implementations of the default loaders for XML configuration files and Groovy scripts and annotated classes. Specifically, the delegation algorithm is as follows:

        • If the resource locations or annotated classes in the supplied ContextConfigurationAttributes are not empty, the appropriate candidate loader will be allowed to process the configuration as is, without any checks for detection of defaults.
        • Otherwise, the XML-based loader will be allowed to process the configuration in order to detect default resource locations. If the XML-based loader detects default resource locations, an info message will be logged.
        • Subsequently, the annotation-based loader will be allowed to process the configuration in order to detect default configuration classes. If the annotation-based loader detects default configuration classes, an info message will be logged.
        Specified by:
        processContextConfiguration in interface SmartContextLoader
        Parameters:
        configAttributes - the context configuration attributes to process
        Throws:
        java.lang.IllegalArgumentException - if the supplied configuration attributes are null, or if the supplied configuration attributes include both resource locations and annotated classes
        java.lang.IllegalStateException - if the XML-based loader detects default configuration classes; if the annotation-based loader detects default resource locations; if neither candidate loader detects defaults for the supplied context configuration; or if both candidate loaders detect defaults for the supplied context configuration