Skip to content

Commit 8579ae6

Browse files
committed
Add comprehensive tests of Kotlin extensions
This commit also removes extensions hidden by Java API (varargs).
1 parent fd53d2a commit 8579ae6

File tree

23 files changed

+766
-158
lines changed

23 files changed

+766
-158
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ configure(allprojects) { project ->
184184
testCompile("org.mockito:mockito-core:2.6.1") {
185185
exclude group:'org.hamcrest', module:'hamcrest-core'
186186
}
187+
testCompile("com.nhaarman:mockito-kotlin:1.5.0")
187188
testCompile("org.hamcrest:hamcrest-all:${hamcrestVersion}")
188189
testRuntime("org.apache.logging.log4j:log4j-core:${log4jVersion}")
189190
}

spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanFactoryExtensions.kt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,6 @@ fun <T : Any> BeanFactory.getBean(requiredType: KClass<T>): T = getBean(required
1919
*/
2020
inline fun <reified T : Any> BeanFactory.getBean(): T = getBean(T::class.java)
2121

22-
/**
23-
* Extension for [BeanFactory.getBean] providing a [KClass] based variant.
24-
*
25-
* @see BeanFactory.getBean(String, Class<T>)
26-
* @author Sebastien Deleuze
27-
* @since 5.0
28-
*/
29-
fun <T : Any> BeanFactory.getBean(name: String, requiredType: KClass<T>): T =
30-
getBean(name, requiredType.java)
31-
3222
/**
3323
* Extension for [BeanFactory.getBean] providing a `getBean<Foo>("foo")` variant.
3424
*
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.springframework.beans.factory
2+
3+
import org.junit.Test
4+
import org.junit.runner.RunWith
5+
import org.mockito.Answers
6+
import org.mockito.Mock
7+
import org.mockito.Mockito
8+
import org.mockito.Mockito.verify
9+
import org.mockito.junit.MockitoJUnitRunner
10+
11+
/**
12+
* Mock object based tests for BeanFactory Kotlin extensions
13+
*
14+
* @author Sebastien Deleuze
15+
*/
16+
@RunWith(MockitoJUnitRunner::class)
17+
class BeanFactoryExtensionsTests {
18+
19+
@Mock(answer = Answers.RETURNS_MOCKS)
20+
lateinit var bf: BeanFactory
21+
22+
@Test
23+
fun `getBean with KClass`() {
24+
bf.getBean(Foo::class)
25+
verify(bf, Mockito.times(1)).getBean(Foo::class.java)
26+
}
27+
28+
@Test
29+
fun `getBean with reified type parameters`() {
30+
bf.getBean<Foo>()
31+
verify(bf, Mockito.times(1)).getBean(Foo::class.java)
32+
}
33+
34+
@Test
35+
fun `getBean with String and reified type parameters`() {
36+
val name = "foo"
37+
bf.getBean<Foo>(name)
38+
verify(bf, Mockito.times(1)).getBean(name, Foo::class.java)
39+
}
40+
41+
@Test
42+
fun `getBean with KClass and varargs`() {
43+
val arg1 = "arg1"
44+
val arg2 = "arg2"
45+
bf.getBean(Foo::class, arg1, arg2)
46+
verify(bf, Mockito.times(1)).getBean(Foo::class.java, arg1, arg2)
47+
}
48+
49+
@Test
50+
fun `getBean with reified type parameters and varargs`() {
51+
val arg1 = "arg1"
52+
val arg2 = "arg2"
53+
bf.getBean<Foo>(arg1, arg2)
54+
verify(bf, Mockito.times(1)).getBean(Foo::class.java, arg1, arg2)
55+
}
56+
57+
class Foo
58+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package org.springframework.beans.factory
2+
3+
import org.junit.Test
4+
import org.junit.runner.RunWith
5+
import org.mockito.Answers
6+
import org.mockito.Mock
7+
import org.mockito.Mockito
8+
import org.mockito.junit.MockitoJUnitRunner
9+
10+
/**
11+
* Mock object based tests for ListableBeanFactory Kotlin extensions
12+
*
13+
* @author Sebastien Deleuze
14+
*/
15+
@RunWith(MockitoJUnitRunner::class)
16+
class ListenableBeanFactoryExtensionsTests {
17+
18+
@Mock(answer = Answers.RETURNS_MOCKS)
19+
lateinit var lbf: ListableBeanFactory
20+
21+
@Test
22+
fun `getBeanNamesForType with KClass`() {
23+
lbf.getBeanNamesForType(Foo::class)
24+
Mockito.verify(lbf, Mockito.times(1)).getBeanNamesForType(Foo::class.java, true , true)
25+
}
26+
27+
@Test
28+
fun `getBeanNamesForType with KClass and Boolean`() {
29+
lbf.getBeanNamesForType(Foo::class, false)
30+
Mockito.verify(lbf, Mockito.times(1)).getBeanNamesForType(Foo::class.java, false , true)
31+
}
32+
33+
@Test
34+
fun `getBeanNamesForType with KClass, Boolean and Boolean`() {
35+
lbf.getBeanNamesForType(Foo::class, false, false)
36+
Mockito.verify(lbf, Mockito.times(1)).getBeanNamesForType(Foo::class.java, false , false)
37+
}
38+
39+
@Test
40+
fun `getBeanNamesForType with reified type parameters`() {
41+
lbf.getBeanNamesForType<Foo>()
42+
Mockito.verify(lbf, Mockito.times(1)).getBeanNamesForType(Foo::class.java, true , true)
43+
}
44+
45+
@Test
46+
fun `getBeanNamesForType with reified type parameters and Boolean`() {
47+
lbf.getBeanNamesForType<Foo>(false)
48+
Mockito.verify(lbf, Mockito.times(1)).getBeanNamesForType(Foo::class.java, false , true)
49+
}
50+
51+
@Test
52+
fun `getBeanNamesForType with reified type parameters, Boolean and Boolean`() {
53+
lbf.getBeanNamesForType<Foo>(false, false)
54+
Mockito.verify(lbf, Mockito.times(1)).getBeanNamesForType(Foo::class.java, false , false)
55+
}
56+
57+
@Test
58+
fun `getBeansOfType with KClass`() {
59+
lbf.getBeansOfType(Foo::class)
60+
Mockito.verify(lbf, Mockito.times(1)).getBeansOfType(Foo::class.java, true , true)
61+
}
62+
63+
@Test
64+
fun `getBeansOfType with KClass and Boolean`() {
65+
lbf.getBeansOfType(Foo::class, false)
66+
Mockito.verify(lbf, Mockito.times(1)).getBeansOfType(Foo::class.java, false , true)
67+
}
68+
69+
@Test
70+
fun `getBeansOfType with KClass, Boolean and Boolean`() {
71+
lbf.getBeansOfType(Foo::class, false, false)
72+
Mockito.verify(lbf, Mockito.times(1)).getBeansOfType(Foo::class.java, false , false)
73+
}
74+
75+
@Test
76+
fun `getBeansOfType with reified type parameters`() {
77+
lbf.getBeansOfType<Foo>()
78+
Mockito.verify(lbf, Mockito.times(1)).getBeansOfType(Foo::class.java, true , true)
79+
}
80+
81+
@Test
82+
fun `getBeansOfType with reified type parameters and Boolean`() {
83+
lbf.getBeansOfType<Foo>(false)
84+
Mockito.verify(lbf, Mockito.times(1)).getBeansOfType(Foo::class.java, false , true)
85+
}
86+
87+
@Test
88+
fun `getBeansOfType with reified type parameters, Boolean and Boolean`() {
89+
lbf.getBeansOfType<Foo>(false, false)
90+
Mockito.verify(lbf, Mockito.times(1)).getBeansOfType(Foo::class.java, false , false)
91+
}
92+
93+
@Test
94+
fun `getBeanNamesForAnnotation with KClass`() {
95+
lbf.getBeanNamesForAnnotation(Bar::class)
96+
Mockito.verify(lbf, Mockito.times(1)).getBeanNamesForAnnotation(Bar::class.java)
97+
}
98+
99+
@Test
100+
fun `getBeanNamesForAnnotation with reified type parameters`() {
101+
lbf.getBeanNamesForAnnotation<Bar>()
102+
Mockito.verify(lbf, Mockito.times(1)).getBeanNamesForAnnotation(Bar::class.java)
103+
}
104+
105+
@Test
106+
fun `getBeansWithAnnotation with KClass`() {
107+
lbf.getBeansWithAnnotation(Bar::class)
108+
Mockito.verify(lbf, Mockito.times(1)).getBeansWithAnnotation(Bar::class.java)
109+
}
110+
111+
@Test
112+
fun `getBeansWithAnnotation with reified type parameters`() {
113+
lbf.getBeansWithAnnotation<Bar>()
114+
Mockito.verify(lbf, Mockito.times(1)).getBeansWithAnnotation(Bar::class.java)
115+
}
116+
117+
@Test
118+
fun `findAnnotationOnBean with String and KClass`() {
119+
val name = "bar"
120+
lbf.findAnnotationOnBean(name, Bar::class)
121+
Mockito.verify(lbf, Mockito.times(1)).findAnnotationOnBean(name, Bar::class.java)
122+
}
123+
124+
@Test
125+
fun `findAnnotationOnBean with String and reified type parameters`() {
126+
val name = "bar"
127+
lbf.findAnnotationOnBean<Bar>(name)
128+
Mockito.verify(lbf, Mockito.times(1)).findAnnotationOnBean(name, Bar::class.java)
129+
}
130+
131+
class Foo
132+
133+
annotation class Bar
134+
}

spring-beans/src/test/kotlin/org/springframework/beans/factory/annotation/KotlinAutowiredTests.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,16 @@
1616

1717
package org.springframework.beans.factory.annotation
1818

19-
import java.lang.reflect.Method
20-
21-
import org.junit.Before
2219
import org.junit.Test
2320

24-
import org.springframework.beans.factory.annotation.Autowired
25-
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
2621
import org.springframework.beans.factory.support.DefaultListableBeanFactory
2722
import org.springframework.beans.factory.support.RootBeanDefinition
2823
import org.springframework.tests.sample.beans.TestBean
2924

3025
import org.junit.Assert.*
3126

3227
/**
33-
* Tests for Kotlin support with [@Autowired].
28+
* Tests for Kotlin support with [Autowired].
3429
*
3530
* @author Juergen Hoeller
3631
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.springframework.context.annotation
2+
3+
import org.junit.Assert.assertNotNull
4+
import org.junit.Test
5+
import org.springframework.beans.factory.getBean
6+
import org.springframework.context.support.registerBean
7+
8+
/**
9+
* Tests for [AnnotationConfigApplicationContext] Kotlin extensions
10+
*
11+
* @author Sebastien Deleuze
12+
*/
13+
class AnnotationConfigApplicationContextExtensionsTests {
14+
15+
@Test
16+
fun `Instantiate AnnotationConfigApplicationContext`() {
17+
val applicationContext = AnnotationConfigApplicationContext {
18+
registerBean<Foo>()
19+
}
20+
applicationContext.refresh()
21+
assertNotNull(applicationContext)
22+
assertNotNull(applicationContext.getBean<Foo>())
23+
}
24+
25+
class Foo
26+
}

spring-context/src/test/kotlin/org/springframework/context/support/GenericApplicationContextExtensionsTests.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import org.junit.Assert.assertNotNull
44
import org.junit.Test
55
import org.springframework.beans.factory.getBean
66

7+
/**
8+
* Tests for [GenericApplicationContext] Kotlin extensions
9+
*
10+
* @author Sebastien Deleuze
11+
*/
712
class GenericApplicationContextExtensionsTests {
813

914
@Test
@@ -69,8 +74,8 @@ class GenericApplicationContextExtensionsTests {
6974
assertNotNull(context.getBean<BeanB>())
7075
}
7176

72-
internal class BeanA
77+
class BeanA
7378

74-
internal class BeanB(val a: BeanA)
79+
class BeanB(val a: BeanA)
7580

7681
}

spring-context/src/test/kotlin/org/springframework/ui/ModelExtensionsTests.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ import org.junit.Assert.assertTrue
2121
import org.junit.Test
2222

2323

24+
/**
25+
* Tests for [Model] Kotlin extensions
26+
*
27+
* @author Sebastien Deleuze
28+
*/
2429
class ModelExtensionsTests {
2530

2631
@Test

spring-context/src/test/kotlin/org/springframework/ui/ModelMapExtensionsTests.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ import org.junit.Assert.assertTrue
2121
import org.junit.Test
2222

2323

24+
/**
25+
* Tests for [ModelMap] Kotlin extensions
26+
*
27+
* @author Sebastien Deleuze
28+
*/
2429
class ModelMapExtensionsTests {
2530

2631
@Test
@@ -30,4 +35,5 @@ class ModelMapExtensionsTests {
3035
assertTrue(model.containsAttribute("foo"))
3136
assertEquals("bing", model["foo"])
3237
}
38+
3339
}

spring-jdbc/src/main/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensions.kt

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,6 @@ fun <T : Any> JdbcOperations.queryForObject(sql: String, requiredType: KClass<T>
9191
queryForObject(sql, requiredType.java, *args)
9292

9393

94-
/**
95-
* Extension for [JdbcOperations.queryForList] providing a [KClass] based variant.
96-
*
97-
* @author Mario Arias
98-
* @since 5.0
99-
*/
100-
fun <T : Any> JdbcOperations.queryForList(sql: String, elementType: KClass<T>): List<T> =
101-
queryForList(sql, elementType.java)
102-
10394
/**
10495
* Extension for [JdbcOperations.queryForList] providing a `queryForList<Foo>("...")` variant.
10596
*
@@ -110,15 +101,6 @@ fun <T : Any> JdbcOperations.queryForList(sql: String, elementType: KClass<T>):
110101
inline fun <reified T : Any> JdbcOperations.queryForList(sql: String): List<T> =
111102
queryForList(sql, T::class.java)
112103

113-
/**
114-
* Extension for [JdbcOperations.queryForList] providing a [KClass] based variant.
115-
*
116-
* @author Mario Arias
117-
* @since 5.0
118-
*/
119-
fun <T : Any> JdbcOperations.queryForList(sql: String, args: Array<out Any>, argTypes: IntArray, elementType: KClass<T>): List<T> =
120-
queryForList(sql, args, argTypes, elementType.java)
121-
122104
/**
123105
* Extension for [JdbcOperations.queryForList] providing a `queryForList<Foo>("...", arrayOf(arg1, argN), intArray(type1, typeN))` variant
124106
*
@@ -129,15 +111,6 @@ fun <T : Any> JdbcOperations.queryForList(sql: String, args: Array<out Any>, arg
129111
inline fun <reified T : Any> JdbcOperations.queryForList(sql: String, args: Array<out Any>, argTypes: IntArray): List<T> =
130112
queryForList(sql, args, argTypes, T::class.java)
131113

132-
/**
133-
* Extension for [JdbcOperations.queryForList] providing a [KClass] based variant.
134-
*
135-
* @author Mario Arias
136-
* @since 5.0
137-
*/
138-
fun <T : Any> JdbcOperations.queryForList(sql: String, args: Array<out Any>, elementType: KClass<T>): List<T> =
139-
queryForList(sql, args, elementType.java)
140-
141114
/**
142115
* Extension for [JdbcOperations.queryForList] providing a `queryForList<Foo>("...", arrayOf(arg1, argN))` variant
143116
*
@@ -174,4 +147,3 @@ fun JdbcOperations.query(sql: String, vararg args: Any, function: (ResultSet) ->
174147
*/
175148
fun <T : Any> JdbcOperations.query(sql: String, vararg args: Any, function: (ResultSet, Int) -> T): List<T> =
176149
query(sql, RowMapper { rs, i -> function(rs, i) }, *args)
177-

0 commit comments

Comments
 (0)