@@ -18,11 +18,15 @@ package org.springframework.web.method.support
18
18
19
19
import org.assertj.core.api.Assertions
20
20
import org.junit.jupiter.api.Test
21
+ import org.springframework.util.ReflectionUtils
21
22
import org.springframework.web.context.request.NativeWebRequest
22
23
import org.springframework.web.context.request.ServletWebRequest
23
24
import org.springframework.web.testfixture.method.ResolvableMethod
24
25
import org.springframework.web.testfixture.servlet.MockHttpServletRequest
25
26
import org.springframework.web.testfixture.servlet.MockHttpServletResponse
27
+ import java.lang.reflect.Method
28
+ import kotlin.reflect.jvm.javaGetter
29
+ import kotlin.reflect.jvm.javaMethod
26
30
27
31
/* *
28
32
* Kotlin unit tests for [InvocableHandlerMethod].
@@ -38,7 +42,7 @@ class InvocableHandlerMethodKotlinTests {
38
42
@Test
39
43
fun intDefaultValue () {
40
44
composite.addResolver(StubArgumentResolver (Int ::class .java, null ))
41
- val value = getInvocable(Handler ::class .java, Int :: class .java ).invokeForRequest(request, null )
45
+ val value = getInvocable(Handler ::intDefaultValue.javaMethod !! ).invokeForRequest(request, null )
42
46
43
47
Assertions .assertThat(getStubResolver(0 ).resolvedParameters).hasSize(1 )
44
48
Assertions .assertThat(value).isEqualTo(" 20" )
@@ -47,7 +51,7 @@ class InvocableHandlerMethodKotlinTests {
47
51
@Test
48
52
fun booleanDefaultValue () {
49
53
composite.addResolver(StubArgumentResolver (Boolean ::class .java, null ))
50
- val value = getInvocable(Handler ::class .java, Boolean :: class .java ).invokeForRequest(request, null )
54
+ val value = getInvocable(Handler ::booleanDefaultValue.javaMethod !! ).invokeForRequest(request, null )
51
55
52
56
Assertions .assertThat(getStubResolver(0 ).resolvedParameters).hasSize(1 )
53
57
Assertions .assertThat(value).isEqualTo(" true" )
@@ -56,7 +60,7 @@ class InvocableHandlerMethodKotlinTests {
56
60
@Test
57
61
fun nullableIntDefaultValue () {
58
62
composite.addResolver(StubArgumentResolver (Int ::class .javaObjectType, null ))
59
- val value = getInvocable(Handler ::class .java, Int :: class .javaObjectType ).invokeForRequest(request, null )
63
+ val value = getInvocable(Handler ::nullableIntDefaultValue.javaMethod !! ).invokeForRequest(request, null )
60
64
61
65
Assertions .assertThat(getStubResolver(0 ).resolvedParameters).hasSize(1 )
62
66
Assertions .assertThat(value).isEqualTo(" 20" )
@@ -65,29 +69,29 @@ class InvocableHandlerMethodKotlinTests {
65
69
@Test
66
70
fun nullableBooleanDefaultValue () {
67
71
composite.addResolver(StubArgumentResolver (Boolean ::class .javaObjectType, null ))
68
- val value = getInvocable(Handler ::class .java, Boolean :: class .javaObjectType ).invokeForRequest(request, null )
72
+ val value = getInvocable(Handler ::nullableBooleanDefaultValue.javaMethod !! ).invokeForRequest(request, null )
69
73
70
74
Assertions .assertThat(getStubResolver(0 ).resolvedParameters).hasSize(1 )
71
75
Assertions .assertThat(value).isEqualTo(" true" )
72
76
}
73
77
74
78
@Test
75
79
fun unitReturnValue () {
76
- val value = getInvocable(Handler ::class .java ).invokeForRequest(request, null )
80
+ val value = getInvocable(Handler ::unit.javaMethod !! ).invokeForRequest(request, null )
77
81
Assertions .assertThat(value).isNull()
78
82
}
79
83
80
84
@Test
81
85
fun nullReturnValue () {
82
86
composite.addResolver(StubArgumentResolver (String ::class .java, null ))
83
- val value = getInvocable(Handler ::class .java, String :: class .java ).invokeForRequest(request, null )
87
+ val value = getInvocable(Handler ::nullable.javaMethod !! ).invokeForRequest(request, null )
84
88
Assertions .assertThat(value).isNull()
85
89
}
86
90
87
91
@Test
88
92
fun private () {
89
93
composite.addResolver(StubArgumentResolver (Float ::class .java, 1.2f ))
90
- val value = getInvocable(Handler ::class .java, Float ::class .java).invokeForRequest(request, null )
94
+ val value = getInvocable(ReflectionUtils .findMethod( Handler ::class .java, " private " , Float ::class .java) !! ).invokeForRequest(request, null )
91
95
92
96
Assertions .assertThat(getStubResolver(0 ).resolvedParameters).hasSize(1 )
93
97
Assertions .assertThat(value).isEqualTo(" 1.2" )
@@ -96,56 +100,56 @@ class InvocableHandlerMethodKotlinTests {
96
100
@Test
97
101
fun valueClass () {
98
102
composite.addResolver(StubArgumentResolver (Long ::class .java, 1L ))
99
- val value = getInvocable(ValueClassHandler ::class .java, Long :: class .java ).invokeForRequest(request, null )
103
+ val value = getInvocable(ValueClassHandler ::longValueClass.javaMethod !! ).invokeForRequest(request, null )
100
104
Assertions .assertThat(value).isEqualTo(1L )
101
105
}
102
106
103
107
@Test
104
108
fun valueClassDefaultValue () {
105
109
composite.addResolver(StubArgumentResolver (Double ::class .java))
106
- val value = getInvocable(ValueClassHandler ::class .java, Double :: class .java ).invokeForRequest(request, null )
110
+ val value = getInvocable(ValueClassHandler ::doubleValueClass.javaMethod !! ).invokeForRequest(request, null )
107
111
Assertions .assertThat(value).isEqualTo(3.1 )
108
112
}
109
113
110
114
@Test
111
115
fun valueClassWithInit () {
112
116
composite.addResolver(StubArgumentResolver (String ::class .java, " " ))
113
- val invocable = getInvocable(ValueClassHandler ::class .java, String :: class .java )
117
+ val invocable = getInvocable(ValueClassHandler ::valueClassWithInit.javaMethod !! )
114
118
Assertions .assertThatIllegalArgumentException().isThrownBy { invocable.invokeForRequest(request, null ) }
115
119
}
116
120
117
121
@Test
118
122
fun valueClassWithNullable () {
119
123
composite.addResolver(StubArgumentResolver (LongValueClass ::class .java, null ))
120
- val value = getInvocable(ValueClassHandler ::class .java, LongValueClass :: class .java ).invokeForRequest(request, null )
124
+ val value = getInvocable(ValueClassHandler ::valueClassWithNullable.javaMethod !! ).invokeForRequest(request, null )
121
125
Assertions .assertThat(value).isNull()
122
126
}
123
127
124
128
@Test
125
129
fun valueClassWithPrivateConstructor () {
126
130
composite.addResolver(StubArgumentResolver (Char ::class .java, ' a' ))
127
- val value = getInvocable(ValueClassHandler ::class .java, Char :: class .java ).invokeForRequest(request, null )
131
+ val value = getInvocable(ValueClassHandler ::valueClassWithPrivateConstructor.javaMethod !! ).invokeForRequest(request, null )
128
132
Assertions .assertThat(value).isEqualTo(' a' )
129
133
}
130
134
131
135
@Test
132
136
fun propertyAccessor () {
133
- val value = getInvocable(PropertyAccessorHandler ::class .java ).invokeForRequest(request, null )
137
+ val value = getInvocable(PropertyAccessorHandler ::prop.javaGetter !! ).invokeForRequest(request, null )
134
138
Assertions .assertThat(value).isEqualTo(" foo" )
135
139
}
136
140
137
141
@Test
138
142
fun extension () {
139
143
composite.addResolver(StubArgumentResolver (CustomException ::class .java, CustomException (" foo" )))
140
- val value = getInvocable(ExtensionHandler ::class .java, CustomException ::class .java).invokeForRequest(request, null )
144
+ val value = getInvocable(ReflectionUtils .findMethod( ExtensionHandler ::class .java, " handle " , CustomException ::class .java) !! ).invokeForRequest(request, null )
141
145
Assertions .assertThat(value).isEqualTo(" foo" )
142
146
}
143
147
144
148
@Test
145
149
fun extensionWithParameter () {
146
150
composite.addResolver(StubArgumentResolver (CustomException ::class .java, CustomException (" foo" )))
147
151
composite.addResolver(StubArgumentResolver (Int ::class .java, 20 ))
148
- val value = getInvocable(ExtensionHandler ::class .java, CustomException ::class .java, Int ::class .java)
152
+ val value = getInvocable(ReflectionUtils .findMethod( ExtensionHandler ::class .java, " handleWithParameter " , CustomException ::class .java, Int ::class .java) !! )
149
153
.invokeForRequest(request, null )
150
154
Assertions .assertThat(value).isEqualTo(" foo-20" )
151
155
}
@@ -154,12 +158,11 @@ class InvocableHandlerMethodKotlinTests {
154
158
fun genericParameter () {
155
159
val horse = Animal (" horse" )
156
160
composite.addResolver(StubArgumentResolver (Animal ::class .java, horse))
157
- val value = getInvocable(AnimalHandler ::class .java, Named ::class .java).invokeForRequest(request, null )
161
+ val value = getInvocable(AnimalHandler ::handle.javaMethod !! , AnimalHandler ::class .java).invokeForRequest(request, null )
158
162
Assertions .assertThat(value).isEqualTo(horse.name)
159
163
}
160
164
161
- private fun getInvocable (clazz : Class <* >, vararg argTypes : Class <* >): InvocableHandlerMethod {
162
- val method = ResolvableMethod .on(clazz).argTypes(* argTypes).resolveMethod()
165
+ private fun getInvocable (method : Method , clazz : Class <* > = method.declaringClass): InvocableHandlerMethod {
163
166
val handlerMethod = InvocableHandlerMethod (clazz.constructors.first().newInstance(), method)
164
167
handlerMethod.setHandlerMethodArgumentResolvers(composite)
165
168
return handlerMethod
@@ -197,10 +200,10 @@ class InvocableHandlerMethodKotlinTests {
197
200
198
201
private class ValueClassHandler {
199
202
200
- fun valueClass (limit : LongValueClass ) =
203
+ fun longValueClass (limit : LongValueClass ) =
201
204
limit.value
202
205
203
- fun valueClass (limit : DoubleValueClass = DoubleValueClass (3.1)) =
206
+ fun doubleValueClass (limit : DoubleValueClass = DoubleValueClass (3.1)) =
204
207
limit.value
205
208
206
209
fun valueClassWithInit (valueClass : ValueClassWithInit ) =
0 commit comments