@@ -23,51 +23,108 @@ import org.springframework.beans.factory.support.RootBeanDefinition
23
23
import org.springframework.tests.sample.beans.TestBean
24
24
25
25
import org.junit.Assert.*
26
+ import org.springframework.tests.sample.beans.Colour
26
27
27
28
/* *
28
29
* Tests for Kotlin support with [Autowired].
29
30
*
30
31
* @author Juergen Hoeller
32
+ * @author Sebastien Deleuze
31
33
*/
32
34
class KotlinAutowiredTests {
33
35
34
36
@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 ()
38
40
bpp.setBeanFactory(bf)
39
41
bf.addBeanPostProcessor(bpp)
40
- var bd = RootBeanDefinition (KotlinBean ::class .java)
42
+ val bd = RootBeanDefinition (KotlinBean ::class .java)
41
43
bd.scope = RootBeanDefinition .SCOPE_PROTOTYPE
42
44
bf.registerBeanDefinition(" annotatedBean" , bd)
43
- var tb = TestBean ()
45
+ val tb = TestBean ()
44
46
bf.registerSingleton(" testBean" , tb)
45
47
46
- var kb = bf.getBean(" annotatedBean" , KotlinBean ::class .java)
48
+ val kb = bf.getBean(" annotatedBean" , KotlinBean ::class .java)
47
49
assertSame(tb, kb.injectedFromConstructor)
48
50
assertSame(tb, kb.injectedFromMethod)
49
51
assertSame(tb, kb.injectedField)
50
52
}
51
53
52
54
@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 ()
56
58
bpp.setBeanFactory(bf)
57
59
bf.addBeanPostProcessor(bpp)
58
- var bd = RootBeanDefinition (KotlinBean ::class .java)
60
+ val bd = RootBeanDefinition (KotlinBean ::class .java)
59
61
bd.scope = RootBeanDefinition .SCOPE_PROTOTYPE
60
62
bf.registerBeanDefinition(" annotatedBean" , bd)
61
63
62
- var kb = bf.getBean(" annotatedBean" , KotlinBean ::class .java)
64
+ val kb = bf.getBean(" annotatedBean" , KotlinBean ::class .java)
63
65
assertNull(kb.injectedFromConstructor)
64
66
assertNull(kb.injectedFromMethod)
65
67
assertNull(kb.injectedField)
66
68
}
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)
67
81
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
+ }
68
87
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
+ }
70
104
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
+
71
128
var injectedFromMethod: TestBean ? = null
72
129
73
130
@Autowired
@@ -79,4 +136,31 @@ class KotlinAutowiredTests {
79
136
}
80
137
}
81
138
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
+
82
166
}
0 commit comments