2020
2121import example .SampleInterface ;
2222
23+ import java .lang .reflect .Method ;
2324import java .util .List ;
2425import java .util .function .Supplier ;
2526
2627import org .junit .jupiter .api .Test ;
28+ import org .junit .jupiter .params .ParameterizedTest ;
29+ import org .junit .jupiter .params .provider .ValueSource ;
2730
2831import org .springframework .beans .factory .annotation .Autowired ;
2932import org .springframework .core .MethodParameter ;
3942 *
4043 * @author Oliver Gierke
4144 * @author Chris Bono
45+ * @author Mark Paluch
4246 * @soundtrack Karlijn Langendijk & Sönke Meinen - Englishman In New York (Sting,
4347 * https://www.youtube.com/watch?v=O7LZsqrnaaA)
4448 */
@@ -126,9 +130,9 @@ void deprecationLoggerOnlyLogsOncePerParameter() {
126130 var parameter = getParameter ("withModelAttribute" , SampleInterface .class );
127131
128132 // 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 );
132136
133137 // Invoke twice but should only log the first time
134138 assertThat (resolver .supportsParameter (parameter )).isTrue ();
@@ -137,12 +141,40 @@ void deprecationLoggerOnlyLogsOncePerParameter() {
137141 verifyNoMoreInteractions (actualLoggerSpy );
138142 }
139143
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+
140160 private static MethodParameter getParameter (String methodName , Class <?> parameterType ) {
141161
142162 var method = ReflectionUtils .findMethod (Controller .class , methodName , parameterType );
143163 return new MethodParameter (method , 0 );
144164 }
145165
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+
146178 @ ProjectedPayload
147179 interface AnnotatedInterface {}
148180
@@ -152,6 +184,8 @@ interface Controller {
152184
153185 void with (AnnotatedInterface param );
154186
187+ void withAnnotatedInterface (@ ModelAttribute AnnotatedInterface param );
188+
155189 void with (UnannotatedInterface param );
156190
157191 void with (SampleInterface param );
0 commit comments