diff --git a/org.springframework.test/src/main/java/org/springframework/test/context/ContextConfiguration.java b/org.springframework.test/src/main/java/org/springframework/test/context/ContextConfiguration.java index 377cbc910cb..b256a5e2916 100644 --- a/org.springframework.test/src/main/java/org/springframework/test/context/ContextConfiguration.java +++ b/org.springframework.test/src/main/java/org/springframework/test/context/ContextConfiguration.java @@ -45,6 +45,13 @@ public @interface ContextConfiguration { */ String[] locations() default {}; + /** + * Alias for {@link #locations()}. + * + * @since 3.0 + */ + String[] value() default {}; + /** * Whether or not {@link #locations() resource locations} from superclasses * should be inherited. diff --git a/org.springframework.test/src/main/java/org/springframework/test/context/TestContext.java b/org.springframework.test/src/main/java/org/springframework/test/context/TestContext.java index 65d5555ea51..575d14b4f0f 100644 --- a/org.springframework.test/src/main/java/org/springframework/test/context/TestContext.java +++ b/org.springframework.test/src/main/java/org/springframework/test/context/TestContext.java @@ -184,7 +184,25 @@ public class TestContext extends AttributeAccessorSupport { logger.trace("Retrieved @ContextConfiguration [" + contextConfiguration + "] for declaring class [" + declaringClass + "]"); } - String[] locations = contextLoader.processLocations(declaringClass, contextConfiguration.locations()); + + String[] valueLocations = contextConfiguration.value(); + String[] locations = contextConfiguration.locations(); + if (!ObjectUtils.isEmpty(valueLocations) && !ObjectUtils.isEmpty(locations)) { + String msg = "Test class [" + + declaringClass + + "] has been configured with @ContextConfiguration's 'value' [" + + ObjectUtils.nullSafeToString(valueLocations) + + "] and 'locations' [" + + ObjectUtils.nullSafeToString(locations) + + "] attributes. Only one declaration of resource locations is permitted per @ContextConfiguration annotation."; + logger.error(msg); + throw new IllegalStateException(msg); + } + else if (!ObjectUtils.isEmpty(valueLocations)) { + locations = valueLocations; + } + + locations = contextLoader.processLocations(declaringClass, locations); locationsList.addAll(0, Arrays. asList(locations)); declaringClass = contextConfiguration.inheritLocations() ? AnnotationUtils.findAnnotationDeclaringClass( annotationType, declaringClass.getSuperclass()) : null; diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests.java b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests.java index ea739e24c58..3790fc2188d 100644 --- a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests.java +++ b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package org.springframework.test.context.junit4; import org.junit.runner.RunWith; - import org.springframework.test.context.ContextConfiguration; import org.springframework.util.ResourceUtils; @@ -25,13 +24,19 @@ import org.springframework.util.ResourceUtils; * Extension of {@link SpringJUnit4ClassRunnerAppCtxTests}, which verifies that * we can specify multiple resource locations for our application context, each * configured differently. - * + *

+ * As of Spring 3.0, + * MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests is also used + * to verify support for the new value attribute alias for + * @ContextConfiguration's locations attribute. + *

+ * * @author Sam Brannen * @since 2.5 * @see SpringJUnit4ClassRunnerAppCtxTests */ @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = { MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests.CLASSPATH_RESOURCE_PATH, +@ContextConfiguration( { MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests.CLASSPATH_RESOURCE_PATH, MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests.LOCAL_RESOURCE_PATH, MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests.ABSOLUTE_RESOURCE_PATH }) public class MultipleResourcesSpringJUnit4ClassRunnerAppCtxTests extends SpringJUnit4ClassRunnerAppCtxTests {