Description
David Erickson opened SPR-12749 and commented
Specific case: a test class is annotated with a meta annotation that itself is annotated with a TestExecutionListeners annotation, and the test class also extends a parent class annotated with a TestExecutionListeners annotation (say AbstractJunit4SpringContextTests).
In this case, MetaAnnotationUtils.findAnnotationDescriptor returns a AnnotationDescriptor class that is correct on all of its fields, except for getAnnotationAttributes(), which is incorrectly returning the attributes of the TestExecutionListeners from the parent class, rather than the meta annotation, which is incorrect based on the description of MetaAnnotationUtils.findAnnotationDescriptor:
The algorithm operates as follows:
Search for the annotation on the given class and return a corresponding AnnotationDescriptor if found.
Recursively search through all annotations that the given class declares.
Recursively search through the superclass hierarchy of the given class.
The net result being the test framework does not pick up my declared TestExecutionListeners from the meta annotation any time a parent of the Test class also declares TestExecutionListeners. I added a spring-framework-issues reproducible project to demonstrate the issue.
Affects: 4.1.4
Reference URL: spring-attic/spring-framework-issues#92
Issue Links:
- @ContextConfiguration defined on a base class and a composed annotation do not merge [SPR-13670] #18245
@ContextConfiguration
defined on a base class and a composed annotation do not merge ("is duplicated by") - ActiveProfiles not included when using a custom annotation. [SPR-13748] #18321 ActiveProfiles not included when using a custom annotation. ("is duplicated by")
- Favor more locally declared composed annotations over inherited annotations [SPR-11598] #16221 Favor more locally declared composed annotations over inherited annotations