diff --git a/org.springframework.test/src/main/java/org/springframework/test/context/ContextConfigurationAttributes.java b/org.springframework.test/src/main/java/org/springframework/test/context/ContextConfigurationAttributes.java index 6ba9d2eec1d..fd584ee5bd9 100644 --- a/org.springframework.test/src/main/java/org/springframework/test/context/ContextConfigurationAttributes.java +++ b/org.springframework.test/src/main/java/org/springframework/test/context/ContextConfigurationAttributes.java @@ -55,7 +55,7 @@ public class ContextConfigurationAttributes { * * @throws IllegalStateException if both the locations and value attributes have been declared */ - static String[] resolveLocations(Class declaringClass, ContextConfiguration contextConfiguration) { + private static String[] resolveLocations(Class declaringClass, ContextConfiguration contextConfiguration) { Assert.notNull(declaringClass, "declaringClass must not be null"); String[] locations = contextConfiguration.locations(); @@ -165,6 +165,18 @@ public class ContextConfigurationAttributes { this.classes = classes; } + /** + * Determine if this {@code ContextConfigurationAttributes} instance has + * either path-based resource locations or class-based resources. + * @return true if neither the {@link #getLocations() locations} + * nor the {@link #getClasses() classes} array is empty + * @see #getLocations() + * @see #getClasses() + */ + public boolean hasResources() { + return !ObjectUtils.isEmpty(getLocations()) && !ObjectUtils.isEmpty(getClasses()); + } + /** * Get the inheritLocations flag that was declared via * {@link ContextConfiguration @ContextConfiguration}. diff --git a/org.springframework.test/src/main/java/org/springframework/test/context/support/AnnotationConfigContextLoader.java b/org.springframework.test/src/main/java/org/springframework/test/context/support/AnnotationConfigContextLoader.java index 87599eb13b1..437750bf4e8 100644 --- a/org.springframework.test/src/main/java/org/springframework/test/context/support/AnnotationConfigContextLoader.java +++ b/org.springframework.test/src/main/java/org/springframework/test/context/support/AnnotationConfigContextLoader.java @@ -138,16 +138,16 @@ public class AnnotationConfigContextLoader extends AbstractGenericContextLoader List> configClasses = new ArrayList>(); - for (Class configClass : declaringClass.getDeclaredClasses()) { - if (isDefaultConfigurationClassCandidate(configClass)) { - configClasses.add(configClass); + for (Class candidate : declaringClass.getDeclaredClasses()) { + if (isDefaultConfigurationClassCandidate(candidate)) { + configClasses.add(candidate); } else { if (logger.isDebugEnabled()) { logger.debug(String.format( "Ignoring class [%s]; it must be static, non-private, non-final, and annotated " + "with @Configuration to be considered a default configuration class.", - configClass.getName())); + candidate.getName())); } } } diff --git a/org.springframework.test/src/main/java/org/springframework/test/context/support/DelegatingSmartContextLoader.java b/org.springframework.test/src/main/java/org/springframework/test/context/support/DelegatingSmartContextLoader.java index c2aa7762e6b..3653d55e4cf 100644 --- a/org.springframework.test/src/main/java/org/springframework/test/context/support/DelegatingSmartContextLoader.java +++ b/org.springframework.test/src/main/java/org/springframework/test/context/support/DelegatingSmartContextLoader.java @@ -27,7 +27,6 @@ import org.springframework.test.context.ContextLoader; import org.springframework.test.context.MergedContextConfiguration; import org.springframework.test.context.SmartContextLoader; import org.springframework.util.Assert; -import org.springframework.util.ObjectUtils; /** * TODO Document DelegatingSmartContextLoader. @@ -60,38 +59,30 @@ public class DelegatingSmartContextLoader implements SmartContextLoader { return false; } - /** - * TODO Document emptyResources(). - */ - private boolean emptyResources(ContextConfigurationAttributes configAttributes) { - return ObjectUtils.isEmpty(configAttributes.getLocations()) - && ObjectUtils.isEmpty(configAttributes.getClasses()); - } - /** * TODO Document processContextConfiguration() implementation. */ public void processContextConfiguration(ContextConfigurationAttributes configAttributes) { - final boolean emptyResources = emptyResources(configAttributes); + final boolean hasResources = configAttributes.hasResources(); for (SmartContextLoader loader : candidates) { if (logger.isDebugEnabled()) { - logger.debug(String.format("Delegating to %s to process context configuration [%s].", + logger.debug(String.format("Potentially delegating to %s to process context configuration [%s].", loader.getClass().getName(), configAttributes)); } // If the original locations and classes were not empty, there's no // need to bother with default generation checks; just let each // loader process the configuration. - if (!emptyResources) { + if (hasResources) { loader.processContextConfiguration(configAttributes); } // Otherwise, if the loader claims to generate defaults, let it // process the configuration. else if (loader.generatesDefaults()) { loader.processContextConfiguration(configAttributes); - if (!emptyResources(configAttributes) && logger.isInfoEnabled()) { + if (configAttributes.hasResources() && logger.isInfoEnabled()) { logger.info(String.format("SmartContextLoader candidate %s " + "generated defaults for context configuration [%s].", loader, configAttributes)); } @@ -100,7 +91,7 @@ public class DelegatingSmartContextLoader implements SmartContextLoader { // If any loader claims to generate defaults but none actually did, // throw an exception. - if (generatesDefaults() && emptyResources(configAttributes)) { + if (generatesDefaults() && !configAttributes.hasResources()) { throw new IllegalStateException(String.format("None of the SmartContextLoader candidates %s " + "was able to generate defaults for context configuration [%s].", candidates, configAttributes)); } @@ -128,10 +119,8 @@ public class DelegatingSmartContextLoader implements SmartContextLoader { Assert.notNull(mergedConfig, "mergedConfig must not be null"); for (SmartContextLoader loader : candidates) { - // Ask each loader if it can load a context from the mergedConfig. - // If a loader can, let it; otherwise, continue iterating over all - // remaining candidates. + // If it can, let it; otherwise, keep iterating. if (loader.supports(mergedConfig)) { if (logger.isDebugEnabled()) { logger.debug(String.format("Delegating to %s to load context from [%s].",