From dd4d6e63ae4704f5cfbe6ae49448df37d143e118 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sun, 3 Apr 2011 14:37:29 +0000 Subject: [PATCH] [SPR-6184] AnnotationConfigContextLoader now generates a default configuration class name; fleshed out documentation of AnnotationConfigContextLoader; introduced sub-package and suite for configuration class tests. --- .../test/context/TestContext.java | 9 +++ .../AnnotationConfigContextLoader.java | 48 +++++++++++----- .../junit4/SpringJUnit4SuiteTests.java | 1 + ...figSpringJUnit4ClassRunnerAppCtxTests.java | 3 +- ...ingJUnit4ClassRunnerAppCtxTestsConfig.java | 2 +- .../AnnotationConfigSuiteTests.java | 39 +++++++++++++ ...faultConfigClassAnnotationConfigTests.java | 57 +++++++++++++++++++ ...onfigClassAnnotationConfigTestsConfig.java | 47 +++++++++++++++ 8 files changed, 191 insertions(+), 15 deletions(-) rename org.springframework.test/src/test/java/org/springframework/test/context/junit4/{ => annotation}/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTests.java (89%) rename org.springframework.test/src/test/java/org/springframework/test/context/junit4/{ => annotation}/AnnotationConfigSpringJUnit4ClassRunnerAppCtxTestsConfig.java (95%) create mode 100644 org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/AnnotationConfigSuiteTests.java create mode 100644 org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/DefaultConfigClassAnnotationConfigTests.java create mode 100644 org.springframework.test/src/test/java/org/springframework/test/context/junit4/annotation/DefaultConfigClassAnnotationConfigTestsConfig.java 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"); + } + +}