33
33
import org .springframework .core .type .classreading .MetadataReaderFactory ;
34
34
import org .springframework .core .type .classreading .SimpleMetadataReaderFactory ;
35
35
import org .springframework .stereotype .Component ;
36
+ import org .springframework .util .MultiValueMap ;
36
37
37
38
import static org .hamcrest .CoreMatchers .*;
38
39
import static org .junit .Assert .*;
@@ -111,7 +112,23 @@ public void metaAnnotationOverridesUsingAnnotationMetadataReadingVisitor() throw
111
112
assertMetaAnnotationOverrides (metadata );
112
113
}
113
114
115
+ /**
116
+ * @param metadata the metadata for {@link ComposedConfigurationWithAttributeOverridesClass}
117
+ */
114
118
private void assertMetaAnnotationOverrides (AnnotationMetadata metadata ) {
119
+ assertAllAttributesForMetaAnnotationOverrides (metadata );
120
+ assertAttributesForMetaAnnotationOverrides (metadata );
121
+
122
+ // SPR-11710: Invoke a 2nd time after invoking getAnnotationAttributes() in order
123
+ // to ensure that getMergedAnnotationAttributes() in AnnotationReadingVisitorUtils
124
+ // does not mutate the state of the metadata.
125
+ assertAllAttributesForMetaAnnotationOverrides (metadata );
126
+ }
127
+
128
+ /**
129
+ * @param metadata the metadata for {@link ComposedConfigurationWithAttributeOverridesClass}
130
+ */
131
+ private void assertAttributesForMetaAnnotationOverrides (AnnotationMetadata metadata ) {
115
132
AnnotationAttributes attributes = (AnnotationAttributes ) metadata .getAnnotationAttributes (
116
133
TestComponentScan .class .getName (), false );
117
134
String [] basePackages = attributes .getStringArray ("basePackages" );
@@ -123,6 +140,30 @@ private void assertMetaAnnotationOverrides(AnnotationMetadata metadata) {
123
140
assertThat ("length of basePackageClasses[]" , basePackageClasses .length , is (0 ));
124
141
}
125
142
143
+ /**
144
+ * @param metadata the metadata for {@link ComposedConfigurationWithAttributeOverridesClass}
145
+ */
146
+ private void assertAllAttributesForMetaAnnotationOverrides (AnnotationMetadata metadata ) {
147
+ MultiValueMap <String , Object > map = metadata .getAllAnnotationAttributes (TestComponentScan .class .getName ());
148
+ List <Object > basePackages = map .get ("basePackages" );
149
+ assertThat ("length of basePackages list" , basePackages .size (), is (1 ));
150
+
151
+ // Ideally, the expected base package should be "org.example.componentscan", but
152
+ // since Spring's annotation processing currently does not support meta-annotation
153
+ // attribute overrides when searching for "all attributes", the actual value found
154
+ // is "bogus".
155
+ String expectedBasePackage = "bogus" ;
156
+ assertThat ("basePackages[0]" , ((String []) basePackages .get (0 ))[0 ], is (expectedBasePackage ));
157
+
158
+ List <Object > value = map .get ("value" );
159
+ assertThat ("length of value list" , value .size (), is (1 ));
160
+ assertThat ("length of 0th value array" , ((String []) value .get (0 )).length , is (0 ));
161
+
162
+ List <Object > basePackageClasses = map .get ("basePackageClasses" );
163
+ assertThat ("length of basePackageClasses list" , basePackageClasses .size (), is (1 ));
164
+ assertThat ("length of 0th basePackageClasses array" , ((Class <?>[]) basePackageClasses .get (0 )).length , is (0 ));
165
+ }
166
+
126
167
private void doTestAnnotationInfo (AnnotationMetadata metadata ) {
127
168
assertThat (metadata .getClassName (), is (AnnotatedComponent .class .getName ()));
128
169
assertThat (metadata .isInterface (), is (false ));
@@ -318,8 +359,10 @@ public static enum SomeEnum {
318
359
// SPR-10914
319
360
public static enum SubclassEnum {
320
361
FOO {
362
+ /* Do not delete! This subclassing is intentional. */
321
363
},
322
364
BAR {
365
+ /* Do not delete! This subclassing is intentional. */
323
366
};
324
367
}
325
368
0 commit comments