Skip to content

Support meta-annotation attribute overrides in the TestContext framework [SPR-11038] #15666

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
7 of 15 tasks
spring-projects-issues opened this issue Oct 28, 2013 · 1 comment
Closed
7 of 15 tasks
Assignees
Labels
in: test Issues in the test module type: enhancement A general enhancement
Milestone

Comments

@spring-projects-issues
Copy link
Collaborator

spring-projects-issues commented Oct 28, 2013

Dave Syer opened SPR-11038 and commented

Overview

#12483 is a nice start, but it didn't go far enough for me (I think).

Spring now supports overrides of "parent" annotation attributes (through its meta data representation utilities introduced in conjunction with #14814). The Spring TestContext Framework, however, is not yet taking advantage of this feature. So for instance you can annotate a custom annotation with @ContextConfiguration, but there's no way for the user of that annotation to provide their own context configuration locations (e.g. classes=...).

Deliverables

Support meta-annotation attribute overrides for the following annotations within the context of the TestContext framework.

  1. @ContextConfiguration
  2. @WebAppConfiguration
  3. @ContextHierarchy
  4. @ActiveProfiles
  5. @DirtiesContext
  6. @TestExecutionListeners
  7. @IfProfileValue
  8. @ProfileValueSourceConfiguration
  9. @Transactional
  10. @BeforeTransaction
  11. @AfterTransaction
  12. @TransactionConfiguration
  13. @Rollback
  14. @Repeat
  15. @Timed
Notes
  • AnnotatedElementUtils does not support overrides for the 'value' attribute of an annotation. It is therefore not possible or not feasible to support meta-annotation attribute overrides for some test-related annotations.
  • Support for meta-annotation attribute overrides for @Transactional was already supported via SpringTransactionAnnotationParser.
  • @BeforeTransaction and @AfterTransaction do not have attributes.
  • @ContextHierarchy, @WebAppConfiguration, @Rollback, @Repeat, and @ProfileValueSourceConfiguration only have single 'value' attributes which cannot be overridden via Spring's meta-annotation attribute support.
  • Although @IfProfileValue has 'values' and 'name' attributes, the typical usage scenario involves the 'value' attribute which is not supported for meta-annotation attribute overrides. Furthermore, 'name' and 'values' are so generic that it is deemed unfeasible to provide meta-annotation attribute override support for these.

Affects: 4.0 RC1

Issue Links:

Referenced from: commits 64f593d, c7c395d

@spring-projects-issues
Copy link
Collaborator Author

Sam Brannen commented

This has been addressed as described in the comments for GitHub commit c7c395d:

Support meta-annotation attr overrides in the TCF

Prior to this commit, the Spring TestContext Framework (TCF) supported
the use of test-related annotations as meta-annotations for composing
custom test stereotype annotations; however, attributes in custom
stereotypes could not be used to override meta-annotation attributes.

This commit addresses this by allowing attributes from the following
annotations (when used as meta-annotations) to be overridden in custom
stereotypes.

  • @ContextConfiguration
  • @ActiveProfiles
  • @DirtiesContext
  • @TransactionConfiguration
  • @Timed
  • @TestExecutionListeners

This support depends on functionality provided by
AnnotatedElementUtils. See the 'Notes' below for further details and
ramifications.

Notes:

  • AnnotatedElementUtils does not support overrides for the 'value'
    attribute of an annotation. It is therefore not possible or not
    feasible to support meta-annotation attribute overrides for some
    test-related annotations.
  • @ContextHierarchy, @WebAppConfiguration, @Rollback, @Repeat, and
    @ProfileValueSourceConfiguration define single 'value' attributes
    which cannot be overridden via Spring's meta-annotation attribute
    support.
  • Although @IfProfileValue has 'values' and 'name' attributes, the
    typical usage scenario involves the 'value' attribute which is not
    supported for meta-annotation attribute overrides. Furthermore,
    'name' and 'values' are so generic that it is deemed unfeasible to
    provide meta-annotation attribute override support for these.
  • @BeforeTransaction and @AfterTransaction do not define any attributes
    that can be overridden.
  • Support for meta-annotation attribute overrides for @Transactional is
    provided indirectly via SpringTransactionAnnotationParser.

Implementation Details:

  • MetaAnnotationUtils.AnnotationDescriptor now provides access to the
    AnnotationAttributes for the described annotation.
  • MetaAnnotationUtils.AnnotationDescriptor now provides access to the
    root declaring class as well as the declaring class.
  • ContextLoaderUtils now retrieves AnnotationAttributes from
    AnnotationDescriptor to look up annotation attributes for
    @ContextConfiguration and @ActiveProfiles.
  • ContextConfigurationAttributes now provides a constructor to have its
    attributes sourced from an instance of AnnotationAttributes.
  • ContextLoaderUtils.resolveContextHierarchyAttributes() now throws an
    IllegalStateException if no class in the class hierarchy declares
    @ContextHierarchy.
  • TransactionalTestExecutionListener now uses AnnotatedElementUtils to
    look up annotation attributes for @TransactionConfiguration.
  • Implemented missing unit tests for @Rollback resolution in
    TransactionalTestExecutionListener.
  • SpringJUnit4ClassRunner now uses AnnotatedElementUtils to look up
    annotation attributes for @Timed.
  • TestContextManager now retrieves AnnotationAttributes from
    AnnotationDescriptor to look up annotation attributes for
    @TestExecutionListeners.
  • DirtiesContextTestExecutionListener now uses AnnotatedElementUtils to
    look up annotation attributes for @DirtiesContext.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
in: test Issues in the test module type: enhancement A general enhancement
Projects
None yet
Development

No branches or pull requests

2 participants