2828import static org .assertj .core .api .Assertions .assertThat ;
2929import static org .assertj .core .api .Assertions .assertThatExceptionOfType ;
3030import static org .springframework .test .context .support .ContextLoaderUtils .resolveContextConfigurationAttributes ;
31+ import static org .springframework .test .context .support .ContextLoaderUtils .resolveDefaultContextConfigurationAttributes ;
3132
3233/**
3334 * Tests for {@link ContextLoaderUtils} involving {@link ContextConfigurationAttributes}.
@@ -164,8 +165,76 @@ void resolveConfigAttributesWithLocationsAndClasses() {
164165 assertThat (attributesList ).hasSize (1 );
165166 }
166167
168+ @ Test
169+ void resolveDefaultContextConfigurationAttributesWithSuperclass () {
170+ var attributesList = resolveDefaultContextConfigurationAttributes (Superclass .class );
171+ assertThat (attributesList ).hasSize (1 );
172+
173+ var configAttributes = attributesList .get (0 );
174+ assertThat (configAttributes .getDeclaringClass ()).isEqualTo (Superclass .class );
175+ assertDefaultAttributes (configAttributes );
176+ }
177+
178+ @ Test
179+ void resolveDefaultContextConfigurationAttributesWithSubclass () {
180+ var attributesList = resolveDefaultContextConfigurationAttributes (Subclass .class );
181+ assertThat (attributesList ).hasSize (2 );
182+
183+ // For bottom-up semantics, Subclass must come before Superclass.
184+ var configAttributes = attributesList .get (0 );
185+ assertThat (configAttributes .getDeclaringClass ()).isEqualTo (Subclass .class );
186+ assertDefaultAttributes (configAttributes );
187+
188+ configAttributes = attributesList .get (1 );
189+ assertThat (configAttributes .getDeclaringClass ()).isEqualTo (Superclass .class );
190+ assertDefaultAttributes (configAttributes );
191+ }
192+
193+ @ Test
194+ void resolveDefaultContextConfigurationAttributesWithNestedClass () {
195+ var attributesList = resolveDefaultContextConfigurationAttributes (Superclass .NestedTests .class );
196+ assertThat (attributesList ).hasSize (2 );
197+
198+ // For bottom-up semantics, Superclass.NestedTests must come before Superclass.
199+ var configAttributes = attributesList .get (0 );
200+ assertThat (configAttributes .getDeclaringClass ()).isEqualTo (Superclass .NestedTests .class );
201+ assertDefaultAttributes (configAttributes );
202+
203+ configAttributes = attributesList .get (1 );
204+ assertThat (configAttributes .getDeclaringClass ()).isEqualTo (Superclass .class );
205+ assertDefaultAttributes (configAttributes );
206+ }
207+
208+ @ Test
209+ void resolveDefaultContextConfigurationAttributesWithNestedClassesInSuperAndSubClasses () {
210+ var attributesList = resolveDefaultContextConfigurationAttributes (Subclass .NestedTests .class );
211+ assertThat (attributesList ).hasSize (3 );
212+
213+ // For bottom-up semantics, Subclass.NestedTests must come before Subclass.
214+ var configAttributes = attributesList .get (0 );
215+ assertThat (configAttributes .getDeclaringClass ()).isEqualTo (Subclass .NestedTests .class );
216+ assertDefaultAttributes (configAttributes );
217+
218+ // For bottom-up semantics, Subclass must come before Superclass.
219+ configAttributes = attributesList .get (1 );
220+ assertThat (configAttributes .getDeclaringClass ()).isEqualTo (Subclass .class );
221+ assertDefaultAttributes (configAttributes );
222+
223+ configAttributes = attributesList .get (2 );
224+ assertThat (configAttributes .getDeclaringClass ()).isEqualTo (Superclass .class );
225+ assertDefaultAttributes (configAttributes );
226+ }
227+
228+
229+ private static void assertDefaultAttributes (ContextConfigurationAttributes configAttributes ) {
230+ assertThat (configAttributes .getClasses ()).isEmpty ();
231+ assertThat (configAttributes .getLocations ()).isEmpty ();
232+ assertThat (configAttributes .getInitializers ()).isEmpty ();
233+ assertThat (configAttributes .getContextLoaderClass ()).isEqualTo (ContextLoader .class );
234+ assertThat (configAttributes .isInheritInitializers ()).isTrue ();
235+ assertThat (configAttributes .isInheritLocations ()).isTrue ();
236+ }
167237
168- // -------------------------------------------------------------------------
169238
170239 @ ContextConfiguration (value = "x" , locations = "y" )
171240 private static class ConflictingLocations {
@@ -175,4 +244,16 @@ private static class ConflictingLocations {
175244 private static class LocationsAndClasses {
176245 }
177246
247+ static class Superclass {
248+ // @Nested
249+ class NestedTests {
250+ }
251+ }
252+
253+ static class Subclass extends Superclass {
254+ // @Nested
255+ class NestedTests {
256+ }
257+ }
258+
178259}
0 commit comments