diff --git a/spring-test/src/test/java/org/springframework/test/context/junit4/spr9051/AtBeanLiteModeScopeTests.java b/spring-test/src/test/java/org/springframework/test/context/junit4/spr9051/AtBeanLiteModeScopeTests.java new file mode 100644 index 00000000000..9a1fe08c37d --- /dev/null +++ b/spring-test/src/test/java/org/springframework/test/context/junit4/spr9051/AtBeanLiteModeScopeTests.java @@ -0,0 +1,104 @@ +/* + * Copyright 2002-2012 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.spr9051; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Scope; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Integration tests that verify proper scoping of beans created in + * {@code @Bean} Lite Mode. + * + * @author Sam Brannen + * @since 3.2 + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = AtBeanLiteModeScopeTests.LiteBeans.class) +public class AtBeanLiteModeScopeTests { + + /** + * This is intentionally not annotated with {@code @Configuration}. + */ + static class LiteBeans { + + @Bean + public LifecycleBean singleton() { + LifecycleBean bean = new LifecycleBean("singleton"); + assertFalse(bean.isInitialized()); + return bean; + } + + @Bean + @Scope("prototype") + public LifecycleBean prototype() { + LifecycleBean bean = new LifecycleBean("prototype"); + assertFalse(bean.isInitialized()); + return bean; + } + } + + + @Autowired + private ApplicationContext applicationContext; + + @Autowired + @Qualifier("singleton") + private LifecycleBean injectedSingletonBean; + + @Autowired + @Qualifier("prototype") + private LifecycleBean injectedPrototypeBean; + + + @Test + public void singletonLiteBean() { + assertNotNull(injectedSingletonBean); + assertTrue(injectedSingletonBean.isInitialized()); + + LifecycleBean retrievedSingletonBean = applicationContext.getBean("singleton", LifecycleBean.class); + assertNotNull(retrievedSingletonBean); + assertTrue(retrievedSingletonBean.isInitialized()); + + assertSame(injectedSingletonBean, retrievedSingletonBean); + } + + @Test + public void prototypeLiteBean() { + assertNotNull(injectedPrototypeBean); + assertTrue(injectedPrototypeBean.isInitialized()); + + LifecycleBean retrievedPrototypeBean = applicationContext.getBean("prototype", LifecycleBean.class); + assertNotNull(retrievedPrototypeBean); + assertTrue(retrievedPrototypeBean.isInitialized()); + + assertNotSame(injectedPrototypeBean, retrievedPrototypeBean); + } + +} diff --git a/spring-test/src/test/java/org/springframework/test/context/junit4/spr9051/TransactionalAnnotatedConfigClassesWithoutAtConfigurationTests.java b/spring-test/src/test/java/org/springframework/test/context/junit4/spr9051/TransactionalAnnotatedConfigClassesWithoutAtConfigurationTests.java index 44063fe18b9..63c6ef5849e 100644 --- a/spring-test/src/test/java/org/springframework/test/context/junit4/spr9051/TransactionalAnnotatedConfigClassesWithoutAtConfigurationTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/junit4/spr9051/TransactionalAnnotatedConfigClassesWithoutAtConfigurationTests.java @@ -73,21 +73,23 @@ public class TransactionalAnnotatedConfigClassesWithoutAtConfigurationTests exte /** * Since this method does not reside in a true {@code @Configuration class}, - * it acts as a factory method instead of a singleton bean. The result is - * that this method will be called at least twice: + * it acts as a factory method when invoked directly (e.g., from + * {@link #transactionManager()}) and as a singleton bean when retrieved + * through the application context (e.g., when injected into the test + * instance). The result is that this method will be called twice: * - *