Spring Framework
  1. Spring Framework
  2. SPR-9863

Support WebApplicationContext hierarchies in the TestContext Framework

    Details

    • Type: New Feature New Feature
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Complete
    • Affects Version/s: 2.5 final
    • Fix Version/s: 3.2.2
    • Component/s: Test, Web
    • Labels:
      None
    • Last commented by a User:
      false

      Description


      Overview

      This issue picks up where SPR-5243 left off. Specifically this issue focuses on adding support for WebApplicationContext hierarchies within single test classes as well as within test class hierarchies.

      Consequently, this issue is heavily dependent on the completion of both SPR-5243 and SPR-5613.


      Goals

      • Ensure that common WAC hierarchies can be configured in integration tests (e.g., root and dispatcher WACs in a parent-child relationship).

      Deliverables

      1. Ensure that hierarchies of WACs can be configured using @ContextHierarchy (see SPR-5613)
      2. Ensure that the type of the root WAC can differ from that of its parent (e.g., a standard ApplicationContext loaded for an EAR)
      3. Set a loaded context as the ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE in the MockServletContext when context hierarchies are used:
        • if an ApplicationContext has no parent and the context is a WAC, set the context as the root WAC
        • if an ApplicationContext has a parent that is not a WAC and the context itself is a WAC, set the context as the root WAC

      Pseudocode Examples


      Root WAC & Dispatcher WAC
      @WebAppConfiguration // path defaults to "file:src/main/webapp"
      @ContextHierarchy({
          @ContextConfiguration(name="root", classes = WebAppConfig.class),
          @ContextConfiguration(name="dispatcher", locations="/spring/dispatcher-config.xml")
      })
      public class ControllerIntegrationTests {}
      

      Class & Context Hierarchies
      @WebAppConfiguration
      @ContextConfiguration("file:src/main/webapp/WEB-INF/applicationContext.xml")
      public abstract class AbstractWebTests {}
      
      @ContextHierarchy(@ContextConfiguration("/spring/soap-ws-config.xml")
      public class SoapWebServiceTests extends AbstractWebTests {}
      
      @ContextHierarchy(@ContextConfiguration("/spring/rest-ws-config.xml")
      public class RestWebServiceTests extends AbstractWebTests {}
      

      Class & Context Hierarchies with Merged and Overridden Configuration

      In ExtendedControllerIntegrationTests the configuration for the root WAC will be overridden, and the configuration for the dispatcher WAC will be merged.

      @WebAppConfiguration // defaults to "file:src/main/webapp"
      @ContextHierarchy({
          @ContextConfiguration(name="root", classes = WebAppConfig.class),
          @ContextConfiguration(name="dispatcher", locations="/spring/user-config.xml")
      })
      public class ControllerIntegrationTests {}
      
      @ContextHierarchy({
          @ContextConfiguration(name="root", locations="/spring/root2.xml", inheritLocations=false),
          @ContextConfiguration(name="dispatcher", locations="/spring/orders-config.xml"),
      })
      public class ExtendedControllerIntegrationTests extends ControllerIntegrationTests {}
      

        Issue Links

          Activity

          Hide
          Sam Brannen added a comment -
          Show
          Sam Brannen added a comment - Submitted pull request: https://github.com/SpringSource/spring-framework/pull/247
          Hide
          Sam Brannen added a comment -

          Completed as described in the comments for GitHub commit 4c5d771764:

          Provide support for context hierarchies in the TCF

          Prior to this commit the Spring TestContext Framework supported creating
          only flat, non-hierarchical contexts. There was no easy way to create
          contexts with parent-child relationships.

          This commit addresses this issue by introducing a new @ContextHierarchy
          annotation that can be used in conjunction with @ContextConfiguration
          for declaring hierarchies of application contexts, either within a
          single test class or within a test class hierarchy. In addition,
          @DirtiesContext now supports a new 'hierarchyMode' attribute for
          controlling context cache clearing for context hierarchies.

          • Introduced a new @ContextHierarchy annotation.
          • Introduced 'name' attribute in @ContextConfiguration.
          • Introduced 'name' property in ContextConfigurationAttributes.
          • TestContext is now aware of @ContextHierarchy in addition to
            @ContextConfiguration.
          • Introduced findAnnotationDeclaringClassForTypes() in AnnotationUtils.
          • Introduced resolveContextHierarchyAttributes() in ContextLoaderUtils.
          • Introduced buildContextHierarchyMap() in ContextLoaderUtils.
          • @ContextConfiguration and @ContextHierarchy may not be used as
            top-level, class-level annotations simultaneously.
          • Introduced reference to the parent configuration in
            MergedContextConfiguration and WebMergedContextConfiguration.
          • Introduced overloaded buildMergedContextConfiguration() methods in
            ContextLoaderUtils in order to handle context hierarchies separately
            from conventional, non-hierarchical contexts.
          • Introduced hashCode() and equals() in ContextConfigurationAttributes.
          • ContextLoaderUtils ensures uniqueness of @ContextConfiguration
            elements within a single @ContextHierarchy declaration.
          • Introduced CacheAwareContextLoaderDelegate that can be used for
            loading contexts with transparent support for interacting with the
            context cache – for example, for retrieving the parent application
            context in a context hierarchy.
          • TestContext now delegates to CacheAwareContextLoaderDelegate for
            loading contexts.
          • Introduced getParentApplicationContext() in MergedContextConfiguration
          • The loadContext(MergedContextConfiguration) methods in
            AbstractGenericContextLoader and AbstractGenericWebContextLoader now
            set the parent context as appropriate.
          • Introduced 'hierarchyMode' attribute in @DirtiesContext with a
            corresponding HierarchyMode enum that defines EXHAUSTIVE and
            CURRENT_LEVEL cache removal modes.
          • ContextCache now internally tracks the relationships between contexts
            that make up a context hierarchy. Furthermore, when a context is
            removed, if it is part of a context hierarchy all corresponding
            contexts will be removed from the cache according to the supplied
            HierarchyMode.
          • AbstractGenericWebContextLoader will set a loaded context as the
            ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE in the MockServletContext when
            context hierarchies are used if the context has no parent or if the
            context has a parent that is not a WAC.
          • Where appropriate, updated Javadoc to refer to the
            ServletTestExecutionListener, which was introduced in 3.2.0.
          • Updated Javadoc to avoid and/or suppress warnings in spring-test.
          • Suppressed remaining warnings in code in spring-test.
          Show
          Sam Brannen added a comment - Completed as described in the comments for GitHub commit 4c5d771764 : Provide support for context hierarchies in the TCF Prior to this commit the Spring TestContext Framework supported creating only flat, non-hierarchical contexts. There was no easy way to create contexts with parent-child relationships. This commit addresses this issue by introducing a new @ContextHierarchy annotation that can be used in conjunction with @ContextConfiguration for declaring hierarchies of application contexts, either within a single test class or within a test class hierarchy. In addition, @DirtiesContext now supports a new 'hierarchyMode' attribute for controlling context cache clearing for context hierarchies. Introduced a new @ContextHierarchy annotation. Introduced 'name' attribute in @ContextConfiguration. Introduced 'name' property in ContextConfigurationAttributes. TestContext is now aware of @ContextHierarchy in addition to @ContextConfiguration. Introduced findAnnotationDeclaringClassForTypes() in AnnotationUtils. Introduced resolveContextHierarchyAttributes() in ContextLoaderUtils. Introduced buildContextHierarchyMap() in ContextLoaderUtils. @ContextConfiguration and @ContextHierarchy may not be used as top-level, class-level annotations simultaneously. Introduced reference to the parent configuration in MergedContextConfiguration and WebMergedContextConfiguration. Introduced overloaded buildMergedContextConfiguration() methods in ContextLoaderUtils in order to handle context hierarchies separately from conventional, non-hierarchical contexts. Introduced hashCode() and equals() in ContextConfigurationAttributes. ContextLoaderUtils ensures uniqueness of @ContextConfiguration elements within a single @ContextHierarchy declaration. Introduced CacheAwareContextLoaderDelegate that can be used for loading contexts with transparent support for interacting with the context cache – for example, for retrieving the parent application context in a context hierarchy. TestContext now delegates to CacheAwareContextLoaderDelegate for loading contexts. Introduced getParentApplicationContext() in MergedContextConfiguration The loadContext(MergedContextConfiguration) methods in AbstractGenericContextLoader and AbstractGenericWebContextLoader now set the parent context as appropriate. Introduced 'hierarchyMode' attribute in @DirtiesContext with a corresponding HierarchyMode enum that defines EXHAUSTIVE and CURRENT_LEVEL cache removal modes. ContextCache now internally tracks the relationships between contexts that make up a context hierarchy. Furthermore, when a context is removed, if it is part of a context hierarchy all corresponding contexts will be removed from the cache according to the supplied HierarchyMode. AbstractGenericWebContextLoader will set a loaded context as the ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE in the MockServletContext when context hierarchies are used if the context has no parent or if the context has a parent that is not a WAC. Where appropriate, updated Javadoc to refer to the ServletTestExecutionListener, which was introduced in 3.2.0. Updated Javadoc to avoid and/or suppress warnings in spring-test. Suppressed remaining warnings in code in spring-test.

            People

            • Assignee:
              Sam Brannen
              Reporter:
              Sam Brannen
              Last updater:
              Sam Brannen
            • Votes:
              3 Vote for this issue
              Watchers:
              7 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:
                Days since last comment:
                1 year, 5 weeks, 6 days ago