20
20
21
21
import example .SampleInterface ;
22
22
23
+ import java .lang .reflect .Method ;
23
24
import java .util .List ;
24
25
import java .util .function .Supplier ;
25
26
26
27
import org .junit .jupiter .api .Test ;
28
+ import org .junit .jupiter .params .ParameterizedTest ;
29
+ import org .junit .jupiter .params .provider .ValueSource ;
27
30
28
31
import org .springframework .beans .factory .annotation .Autowired ;
29
32
import org .springframework .core .MethodParameter ;
39
42
*
40
43
* @author Oliver Gierke
41
44
* @author Chris Bono
45
+ * @author Mark Paluch
42
46
* @soundtrack Karlijn Langendijk & Sönke Meinen - Englishman In New York (Sting,
43
47
* https://www.youtube.com/watch?v=O7LZsqrnaaA)
44
48
*/
@@ -126,9 +130,9 @@ void deprecationLoggerOnlyLogsOncePerParameter() {
126
130
var parameter = getParameter ("withModelAttribute" , SampleInterface .class );
127
131
128
132
// Spy on the actual logger
129
- var actualLogger = ( LogAccessor ) ReflectionTestUtils . getField (ProxyingHandlerMethodArgumentResolver .class , "LOGGER" );
130
- var actualLoggerSpy = spy ( actualLogger );
131
- ReflectionTestUtils . setField ( ProxyingHandlerMethodArgumentResolver . class , "LOGGER" , actualLoggerSpy , LogAccessor .class );
133
+ var actualLoggerSpy = spy ( new LogAccessor (ProxyingHandlerMethodArgumentResolver .class ) );
134
+ ReflectionTestUtils . setField ( ProxyingHandlerMethodArgumentResolver . class , "LOGGER" , actualLoggerSpy ,
135
+ LogAccessor .class );
132
136
133
137
// Invoke twice but should only log the first time
134
138
assertThat (resolver .supportsParameter (parameter )).isTrue ();
@@ -137,12 +141,40 @@ void deprecationLoggerOnlyLogsOncePerParameter() {
137
141
verifyNoMoreInteractions (actualLoggerSpy );
138
142
}
139
143
144
+ @ ParameterizedTest // GH-3300
145
+ @ ValueSource (strings = { "withProjectedPayload" , "withAnnotatedInterface" })
146
+ void shouldNotLogDeprecationForValidUsage (String methodName ) {
147
+
148
+ var parameter = getParameter (methodName );
149
+
150
+ // Spy on the actual logger
151
+ var actualLoggerSpy = spy (new LogAccessor (ProxyingHandlerMethodArgumentResolver .class ));
152
+ ReflectionTestUtils .setField (ProxyingHandlerMethodArgumentResolver .class , "LOGGER" , actualLoggerSpy ,
153
+ LogAccessor .class );
154
+
155
+ // Invoke twice but should only log the first time
156
+ assertThat (resolver .supportsParameter (parameter )).isTrue ();
157
+ verifyNoInteractions (actualLoggerSpy );
158
+ }
159
+
140
160
private static MethodParameter getParameter (String methodName , Class <?> parameterType ) {
141
161
142
162
var method = ReflectionUtils .findMethod (Controller .class , methodName , parameterType );
143
163
return new MethodParameter (method , 0 );
144
164
}
145
165
166
+ private static MethodParameter getParameter (String methodName ) {
167
+
168
+ for (Method method : Controller .class .getMethods ()) {
169
+
170
+ if (method .getName ().equals (methodName )) {
171
+ return new MethodParameter (method , 0 );
172
+ }
173
+ }
174
+
175
+ throw new NoSuchMethodError (methodName );
176
+ }
177
+
146
178
@ ProjectedPayload
147
179
interface AnnotatedInterface {}
148
180
@@ -152,6 +184,8 @@ interface Controller {
152
184
153
185
void with (AnnotatedInterface param );
154
186
187
+ void withAnnotatedInterface (@ ModelAttribute AnnotatedInterface param );
188
+
155
189
void with (UnannotatedInterface param );
156
190
157
191
void with (SampleInterface param );
0 commit comments