@@ -23,51 +23,108 @@ import org.springframework.beans.factory.support.RootBeanDefinition
2323import org.springframework.tests.sample.beans.TestBean
2424
2525import org.junit.Assert.*
26+ import org.springframework.tests.sample.beans.Colour
2627
2728/* *
2829 * Tests for Kotlin support with [Autowired].
2930 *
3031 * @author Juergen Hoeller
32+ * @author Sebastien Deleuze
3133 */
3234class KotlinAutowiredTests {
3335
3436 @Test
35- fun autowiringWithTarget () {
36- var bf = DefaultListableBeanFactory ()
37- var bpp = AutowiredAnnotationBeanPostProcessor ()
37+ fun `Autowiring with target` () {
38+ val bf = DefaultListableBeanFactory ()
39+ val bpp = AutowiredAnnotationBeanPostProcessor ()
3840 bpp.setBeanFactory(bf)
3941 bf.addBeanPostProcessor(bpp)
40- var bd = RootBeanDefinition (KotlinBean ::class .java)
42+ val bd = RootBeanDefinition (KotlinBean ::class .java)
4143 bd.scope = RootBeanDefinition .SCOPE_PROTOTYPE
4244 bf.registerBeanDefinition(" annotatedBean" , bd)
43- var tb = TestBean ()
45+ val tb = TestBean ()
4446 bf.registerSingleton(" testBean" , tb)
4547
46- var kb = bf.getBean(" annotatedBean" , KotlinBean ::class .java)
48+ val kb = bf.getBean(" annotatedBean" , KotlinBean ::class .java)
4749 assertSame(tb, kb.injectedFromConstructor)
4850 assertSame(tb, kb.injectedFromMethod)
4951 assertSame(tb, kb.injectedField)
5052 }
5153
5254 @Test
53- fun autowiringWithoutTarget () {
54- var bf = DefaultListableBeanFactory ()
55- var bpp = AutowiredAnnotationBeanPostProcessor ()
55+ fun `Autowiring without target` () {
56+ val bf = DefaultListableBeanFactory ()
57+ val bpp = AutowiredAnnotationBeanPostProcessor ()
5658 bpp.setBeanFactory(bf)
5759 bf.addBeanPostProcessor(bpp)
58- var bd = RootBeanDefinition (KotlinBean ::class .java)
60+ val bd = RootBeanDefinition (KotlinBean ::class .java)
5961 bd.scope = RootBeanDefinition .SCOPE_PROTOTYPE
6062 bf.registerBeanDefinition(" annotatedBean" , bd)
6163
62- var kb = bf.getBean(" annotatedBean" , KotlinBean ::class .java)
64+ val kb = bf.getBean(" annotatedBean" , KotlinBean ::class .java)
6365 assertNull(kb.injectedFromConstructor)
6466 assertNull(kb.injectedFromMethod)
6567 assertNull(kb.injectedField)
6668 }
69+
70+ @Test // SPR-15847
71+ fun `Autowiring by primary constructor with optional parameter` () {
72+ val bf = DefaultListableBeanFactory ()
73+ val bpp = AutowiredAnnotationBeanPostProcessor ()
74+ bpp.setBeanFactory(bf)
75+ bf.addBeanPostProcessor(bpp)
76+ val bd = RootBeanDefinition (KotlinBeanWithOptionalParameter ::class .java)
77+ bd.scope = RootBeanDefinition .SCOPE_PROTOTYPE
78+ bf.registerBeanDefinition(" bean" , bd)
79+ val tb = TestBean ()
80+ bf.registerSingleton(" testBean" , tb)
6781
82+ val kb = bf.getBean(" bean" , KotlinBeanWithOptionalParameter ::class .java)
83+ assertSame(tb, kb.injectedFromConstructor)
84+ assertEquals(" foo" , kb.optional)
85+ assertEquals(" bar" , kb.initializedField)
86+ }
6887
69- class KotlinBean (val injectedFromConstructor : TestBean ? ) {
88+ @Test // SPR-15847
89+ fun `Autowiring by annotated primary constructor with optional parameter` () {
90+ val bf = DefaultListableBeanFactory ()
91+ val bpp = AutowiredAnnotationBeanPostProcessor ()
92+ bpp.setBeanFactory(bf)
93+ bf.addBeanPostProcessor(bpp)
94+ val bd = RootBeanDefinition (KotlinBeanWithOptionalParameterAndExplicitConstructor ::class .java)
95+ bd.scope = RootBeanDefinition .SCOPE_PROTOTYPE
96+ bf.registerBeanDefinition(" bean" , bd)
97+ val tb = TestBean ()
98+ bf.registerSingleton(" testBean" , tb)
99+
100+ val kb = bf.getBean(" bean" , KotlinBeanWithOptionalParameterAndExplicitConstructor ::class .java)
101+ assertSame(tb, kb.injectedFromConstructor)
102+ assertEquals(" foo" , kb.optional)
103+ }
70104
105+ @Test // SPR-15847
106+ fun `Autowiring by annotated secondary constructor with optional parameter` () {
107+ val bf = DefaultListableBeanFactory ()
108+ val bpp = AutowiredAnnotationBeanPostProcessor ()
109+ bpp.setBeanFactory(bf)
110+ bf.addBeanPostProcessor(bpp)
111+ val bd = RootBeanDefinition (KotlinBeanWithSecondaryConstructor ::class .java)
112+ bd.scope = RootBeanDefinition .SCOPE_PROTOTYPE
113+ bf.registerBeanDefinition(" bean" , bd)
114+ val tb = TestBean ()
115+ bf.registerSingleton(" testBean" , tb)
116+ val colour = Colour .BLUE
117+ bf.registerSingleton(" colour" , colour)
118+
119+ val kb = bf.getBean(" bean" , KotlinBeanWithSecondaryConstructor ::class .java)
120+ assertSame(tb, kb.injectedFromConstructor)
121+ assertEquals(" bar" , kb.optional)
122+ assertSame(colour, kb.injectedFromSecondaryConstructor)
123+ }
124+
125+
126+ class KotlinBean (val injectedFromConstructor : TestBean ? ) {
127+
71128 var injectedFromMethod: TestBean ? = null
72129
73130 @Autowired
@@ -79,4 +136,31 @@ class KotlinAutowiredTests {
79136 }
80137 }
81138
139+ class KotlinBeanWithOptionalParameter (
140+ val injectedFromConstructor : TestBean ,
141+ val optional : String = " foo"
142+ ) {
143+ var initializedField: String? = null
144+
145+ init {
146+ initializedField = " bar"
147+ }
148+ }
149+
150+ class KotlinBeanWithOptionalParameterAndExplicitConstructor @Autowired constructor(
151+ val optional : String = " foo" ,
152+ val injectedFromConstructor : TestBean
153+ )
154+
155+ class KotlinBeanWithSecondaryConstructor (
156+ val optional : String = " foo" ,
157+ val injectedFromConstructor : TestBean
158+ ) {
159+ @Autowired constructor (injectedFromSecondaryConstructor: Colour , injectedFromConstructor: TestBean , optional: String = " bar" ) : this (optional, injectedFromConstructor) {
160+ this .injectedFromSecondaryConstructor = injectedFromSecondaryConstructor
161+ }
162+
163+ var injectedFromSecondaryConstructor: Colour ? = null
164+ }
165+
82166}
0 commit comments