Skip to content

Commit 7d22315

Browse files
committed
Unit tests for java.util.Optional with autowired collections on @Autowired fields/methods and @bean method parameters
Issue: SPR-9132
1 parent bf5739c commit 7d22315

File tree

2 files changed

+139
-3
lines changed

2 files changed

+139
-3
lines changed

spring-beans/src/test/java/org/springframework/beans/factory/annotation/InjectAnnotationBeanPostProcessorTests.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,62 @@ public void testOptionalMethodInjectionWithBeanNotAvailable() {
630630
bf.destroySingletons();
631631
}
632632

633+
@Test
634+
public void testOptionalListFieldInjectionWithBeanAvailable() {
635+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
636+
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
637+
bpp.setBeanFactory(bf);
638+
bf.addBeanPostProcessor(bpp);
639+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(OptionalListFieldInjectionBean.class));
640+
bf.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class));
641+
642+
OptionalListFieldInjectionBean bean = (OptionalListFieldInjectionBean) bf.getBean("annotatedBean");
643+
assertTrue(bean.getTestBean().isPresent());
644+
assertSame(bf.getBean("testBean"), bean.getTestBean().get().get(0));
645+
bf.destroySingletons();
646+
}
647+
648+
@Test
649+
public void testOptionalListFieldInjectionWithBeanNotAvailable() {
650+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
651+
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
652+
bpp.setBeanFactory(bf);
653+
bf.addBeanPostProcessor(bpp);
654+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(OptionalListFieldInjectionBean.class));
655+
656+
OptionalListFieldInjectionBean bean = (OptionalListFieldInjectionBean) bf.getBean("annotatedBean");
657+
assertFalse(bean.getTestBean().isPresent());
658+
bf.destroySingletons();
659+
}
660+
661+
@Test
662+
public void testOptionalListMethodInjectionWithBeanAvailable() {
663+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
664+
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
665+
bpp.setBeanFactory(bf);
666+
bf.addBeanPostProcessor(bpp);
667+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(OptionalListMethodInjectionBean.class));
668+
bf.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class));
669+
670+
OptionalListMethodInjectionBean bean = (OptionalListMethodInjectionBean) bf.getBean("annotatedBean");
671+
assertTrue(bean.getTestBean().isPresent());
672+
assertSame(bf.getBean("testBean"), bean.getTestBean().get().get(0));
673+
bf.destroySingletons();
674+
}
675+
676+
@Test
677+
public void testOptionalListMethodInjectionWithBeanNotAvailable() {
678+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
679+
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
680+
bpp.setBeanFactory(bf);
681+
bf.addBeanPostProcessor(bpp);
682+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(OptionalListMethodInjectionBean.class));
683+
684+
OptionalListMethodInjectionBean bean = (OptionalListMethodInjectionBean) bf.getBean("annotatedBean");
685+
assertFalse(bean.getTestBean().isPresent());
686+
bf.destroySingletons();
687+
}
688+
633689
@Test
634690
public void testProviderOfOptionalFieldInjectionWithBeanAvailable() {
635691
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
@@ -1239,6 +1295,32 @@ public Optional<TestBean> getTestBean() {
12391295
}
12401296

12411297

1298+
public static class OptionalListFieldInjectionBean {
1299+
1300+
@Inject
1301+
private Optional<List<TestBean>> testBean;
1302+
1303+
public Optional<List<TestBean>> getTestBean() {
1304+
return this.testBean;
1305+
}
1306+
}
1307+
1308+
1309+
public static class OptionalListMethodInjectionBean {
1310+
1311+
private Optional<List<TestBean>> testBean;
1312+
1313+
@Inject
1314+
public void setTestBean(Optional<List<TestBean>> testBeanFactory) {
1315+
this.testBean = testBeanFactory;
1316+
}
1317+
1318+
public Optional<List<TestBean>> getTestBean() {
1319+
return this.testBean;
1320+
}
1321+
}
1322+
1323+
12421324
public static class ProviderOfOptionalFieldInjectionBean {
12431325

12441326
@Inject

spring-context/src/test/java/org/springframework/context/annotation/configuration/AutowiredConfigurationTests.java

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.context.annotation.configuration;
1818

19+
import java.util.List;
20+
import java.util.Optional;
1921
import javax.inject.Provider;
2022

2123
import org.junit.Test;
@@ -58,6 +60,33 @@ public void testAutowiredConfigurationDependencies() {
5860
assertThat(factory.getBean("testBean", TestBean.class).getName(), equalTo(Colour.RED.toString()));
5961
}
6062

63+
@Test
64+
public void testAutowiredConfigurationMethodDependencies() {
65+
AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(
66+
AutowiredMethodConfig.class, ColorConfig.class);
67+
68+
assertThat(factory.getBean(Colour.class), equalTo(Colour.RED));
69+
assertThat(factory.getBean(TestBean.class).getName(), equalTo("RED-RED"));
70+
}
71+
72+
@Test
73+
public void testAutowiredConfigurationMethodDependenciesWithOptionalAndAvailable() {
74+
AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(
75+
OptionalAutowiredMethodConfig.class, ColorConfig.class);
76+
77+
assertThat(factory.getBean(Colour.class), equalTo(Colour.RED));
78+
assertThat(factory.getBean(TestBean.class).getName(), equalTo("RED-RED"));
79+
}
80+
81+
@Test
82+
public void testAutowiredConfigurationMethodDependenciesWithOptionalAndNotAvailable() {
83+
AnnotationConfigApplicationContext factory = new AnnotationConfigApplicationContext(
84+
OptionalAutowiredMethodConfig.class);
85+
86+
assertTrue(factory.getBeansOfType(Colour.class).isEmpty());
87+
assertThat(factory.getBean(TestBean.class).getName(), equalTo(""));
88+
}
89+
6190
/**
6291
* {@link Autowired} constructors are not supported on {@link Configuration} classes
6392
* due to CGLIB constraints
@@ -151,11 +180,26 @@ public TestBean testBean() {
151180

152181

153182
@Configuration
154-
static class ColorConfig {
183+
static class AutowiredMethodConfig {
155184

156185
@Bean
157-
public Colour colour() {
158-
return Colour.RED;
186+
public TestBean testBean(Colour colour, List<Colour> colours) {
187+
return new TestBean(colour.toString() + "-" + colours.get(0).toString());
188+
}
189+
}
190+
191+
192+
@Configuration
193+
static class OptionalAutowiredMethodConfig {
194+
195+
@Bean
196+
public TestBean testBean(Optional<Colour> colour, Optional<List<Colour>> colours) {
197+
if (!colour.isPresent() && !colours.isPresent()) {
198+
return new TestBean("");
199+
}
200+
else {
201+
return new TestBean(colour.get().toString() + "-" + colours.get().get(0).toString());
202+
}
159203
}
160204
}
161205

@@ -172,6 +216,16 @@ static class AutowiredConstructorConfig {
172216
}
173217

174218

219+
@Configuration
220+
static class ColorConfig {
221+
222+
@Bean
223+
public Colour colour() {
224+
return Colour.RED;
225+
}
226+
}
227+
228+
175229
@Configuration
176230
static class ValueConfig {
177231

0 commit comments

Comments
 (0)