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 16fbce2fa8a..3e7906e901a 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
@@ -29,6 +29,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.core.AttributeAccessorSupport;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.style.ToStringCreator;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
@@ -253,6 +254,14 @@ public class TestContext extends AttributeAccessorSupport {
}
return locationsList.toArray(new String[locationsList.size()]);
}
+
+ // TODO [SPR-6184] Remove interim-solution ACCL check.
+ //
+ // Config classes are not defined, but the context loader might
+ // have been set to AnnotationConfigContextLoader.
+ if (AnnotationConfigContextLoader.class.isAssignableFrom(cc.loader())) {
+ return contextLoader.processLocations(declaringClass, new String[] {});
+ }
}
while (declaringClass != null) {
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 202cb9b97df..6c13bb1095f 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
@@ -44,32 +44,42 @@ public class AnnotationConfigContextLoader extends AbstractGenericContextLoader
}
/**
- * TODO Document overridden loadBeanDefinitions().
+ * Registers {@link org.springframework.context.annotation.Configuration configuration classes}
+ * in the supplied {@link AnnotationConfigApplicationContext} from the specified
+ * class names. Each class name must be the fully qualified class name of a
+ * configuration class. The AnnotationConfigApplicationContext
+ * assumes the responsibility of loading the appropriate bean definitions.
+ *
Note that this method does not call {@link #createBeanDefinitionReader}.
+ * @param context the context in which the configuration classes should be registered
+ * @param classNames the names of configuration classes to register in the context
+ * @throws IllegalArgumentException if the supplied context is not an instance of
+ * AnnotationConfigApplicationContext or if a supplied class name
+ * does not represent a class
+ * @see #createGenericApplicationContext
*/
@Override
- protected void loadBeanDefinitions(GenericApplicationContext context, String... locations) {
+ protected void loadBeanDefinitions(GenericApplicationContext context, String... classNames) {
Assert.isInstanceOf(AnnotationConfigApplicationContext.class, context,
"context must be an instance of AnnotationConfigApplicationContext");
- AnnotationConfigApplicationContext annotationConfigApplicationContext = (AnnotationConfigApplicationContext) context;
+ Class>[] configClasses = new Class>[classNames.length];
- Class>[] configClasses = new Class>[locations.length];
- for (int i = 0; i < locations.length; i++) {
+ for (int i = 0; i < classNames.length; i++) {
+ String className = classNames[i];
try {
- Class> clazz = getClass().getClassLoader().loadClass(locations[i]);
- configClasses[i] = clazz;
+ configClasses[i] = (Class>) getClass().getClassLoader().loadClass(className);
}
catch (ClassNotFoundException e) {
throw new IllegalArgumentException(String.format(
- "The supplied resource location [%s] does not represent a class.", locations[i]), e);
+ "The supplied class name [%s] does not represent a class.", className), e);
}
}
if (logger.isDebugEnabled()) {
logger.debug("Registering configuration classes: " + ObjectUtils.nullSafeToString(configClasses));
}
- annotationConfigApplicationContext.register(configClasses);
+ ((AnnotationConfigApplicationContext) context).register(configClasses);
}
/**
@@ -81,12 +91,23 @@ public class AnnotationConfigContextLoader extends AbstractGenericContextLoader
}
/**
- * TODO Document overridden generateDefaultLocations().
+ * Generates the default {@link org.springframework.context.annotation.Configuration configuration class}
+ * names array based on the supplied class.
+ *
For example, if the supplied class is com.example.MyTest,
+ * the generated array will contain a single string with a value of
+ * "com.example.MyTest<suffix>",
+ * where <suffix> is the value of the
+ * {@link #getResourceSuffix() resource suffix} string.
+ * @param clazz the class for which the default configuration class names are to be generated
+ * @return an array of default configuration class names
+ * @see #getResourceSuffix()
*/
@Override
protected String[] generateDefaultLocations(Class> clazz) {
- // TODO Implement generateDefaultLocations().
- throw new UnsupportedOperationException("Not yet implemented");
+ Assert.notNull(clazz, "Class must not be null");
+ String suffix = getResourceSuffix();
+ Assert.hasText(suffix, "Resource suffix must not be empty");
+ return new String[] { clazz.getName() + suffix };
}
/**
@@ -98,7 +119,8 @@ public class AnnotationConfigContextLoader extends AbstractGenericContextLoader
}
/**
- * Returns "Config".
+ * Returns "Config"; intended to be used as a suffix
+ * to be appended to the name of the test class.
*/
@Override
protected String getResourceSuffix() {
diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/SpringJUnit4SuiteTests.java b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/SpringJUnit4SuiteTests.java
index 605c98a877e..069eb427174 100644
--- a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/SpringJUnit4SuiteTests.java
+++ b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/SpringJUnit4SuiteTests.java
@@ -21,6 +21,7 @@ import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import org.springframework.test.context.ClassLevelDirtiesContextTests;
import org.springframework.test.context.SpringRunnerContextCacheTests;
+import org.springframework.test.context.junit4.annotation.AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests;
import org.springframework.test.context.junit4.orm.HibernateSessionFlushingTests;
/**
diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests.java b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests.java
similarity index 89%
rename from org.springframework.test/src/test/java/org/springframework/test/context/junit4/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests.java
rename to org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests.java
index d717edefbde..2252a9e2a95 100644
--- a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests.java
+++ b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests.java
@@ -14,9 +14,10 @@
* limitations under the License.
*/
-package org.springframework.test.context.junit4;
+package org.springframework.test.context.junit4.annotation;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunnerAppCtxTests;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
/**
diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTestsConfig.java b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTestsConfig.java
similarity index 95%
rename from org.springframework.test/src/test/java/org/springframework/test/context/junit4/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTestsConfig.java
rename to org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTestsConfig.java
index 82f9a796ed9..e72c4c8edab 100644
--- a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTestsConfig.java
+++ b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTestsConfig.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.test.context.junit4;
+package org.springframework.test.context.junit4.annotation;
import org.springframework.beans.Employee;
import org.springframework.beans.Pet;
diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSuiteTests.java b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSuiteTests.java
new file mode 100644
index 00000000000..89be1dad74a
--- /dev/null
+++ b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSuiteTests.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2002-2011 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.test.context.junit4.annotation;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+/**
+ * TODO Document AnnotationConfigSuiteTests.
+ *
+ * @author Sam Brannen
+ * @since 3.1
+ */
+@RunWith(Suite.class)
+// Note: the following 'multi-line' layout is for enhanced code readability.
+@SuiteClasses({
+
+AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests.class,
+
+DefaultConfigClassAnnotationConfigTests.class
+
+})
+public class AnnotationConfigSuiteTests {
+}
diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/DefaultConfigClassAnnotationConfigTests.java b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/DefaultConfigClassAnnotationConfigTests.java
new file mode 100644
index 00000000000..678e798542d
--- /dev/null
+++ b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/DefaultConfigClassAnnotationConfigTests.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2002-2011 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.test.context.junit4.annotation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.Employee;
+import org.springframework.beans.Pet;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+/**
+ * TODO [SPR-6184] Document DefaultConfigClassAnnotationConfigTests.
+ *
+ * @author Sam Brannen
+ * @since 3.1
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+public class DefaultConfigClassAnnotationConfigTests {
+
+ @Autowired
+ private Employee employee;
+
+ @Autowired
+ private Pet pet;
+
+
+ @Test
+ public final void autowiredFields() {
+ assertNotNull("The employee field should have been autowired.", this.employee);
+ assertEquals("John Smith", this.employee.getName());
+
+ assertNotNull("The pet field should have been autowired.", this.pet);
+ assertEquals("Fido", this.pet.getName());
+ }
+
+}
diff --git a/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/DefaultConfigClassAnnotationConfigTestsConfig.java b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/DefaultConfigClassAnnotationConfigTestsConfig.java
new file mode 100644
index 00000000000..67fc8f15bbc
--- /dev/null
+++ b/org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/DefaultConfigClassAnnotationConfigTestsConfig.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2002-2011 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.test.context.junit4.annotation;
+
+import org.springframework.beans.Employee;
+import org.springframework.beans.Pet;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * TODO [SPR-6184] Document configuration class.
+ *
+ * @author Sam Brannen
+ * @since 3.1
+ */
+@Configuration
+public class DefaultConfigClassAnnotationConfigTestsConfig {
+
+ @Bean
+ public Employee employee() {
+ Employee employee = new Employee();
+ employee.setName("John Smith");
+ employee.setAge(42);
+ employee.setCompany("Acme Widgets, Inc.");
+ return employee;
+ }
+
+ @Bean
+ public Pet pet() {
+ return new Pet("Fido");
+ }
+
+}