@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2012 the original author or authors .
* Copyright 2002 - 2014 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -47,7 +47,6 @@ import org.springframework.web.servlet.view.RedirectView;
@@ -47,7 +47,6 @@ import org.springframework.web.servlet.view.RedirectView;
import static org.junit.Assert.* ;
import static org.mockito.Mockito.mock ;
import static org.mockito.Mockito.when ;
/ * *
* Test fixture with { @link ServletInvocableHandlerMethod } .
@ -68,48 +67,50 @@ public class ServletInvocableHandlerMethodTests {
@@ -68,48 +67,50 @@ public class ServletInvocableHandlerMethodTests {
private MockHttpServletResponse response ;
@Before
public void setUp ( ) throws Exception {
returnValueHandlers = new HandlerMethodReturnValueHandlerComposite ( ) ;
argumentResolvers = new HandlerMethodArgumentResolverComposite ( ) ;
mavContainer = new ModelAndViewContainer ( ) ;
request = new MockHttpServletRequest ( ) ;
response = new MockHttpServletResponse ( ) ;
webRequest = new ServletWebRequest ( request , response ) ;
this . returnValueHandlers = new HandlerMethodReturnValueHandlerComposite ( ) ;
this . argumentResolvers = new HandlerMethodArgumentResolverComposite ( ) ;
this . mavContainer = new ModelAndViewContainer ( ) ;
this . request = new MockHttpServletRequest ( ) ;
this . response = new MockHttpServletResponse ( ) ;
this . webRequest = new ServletWebRequest ( this . request , this . response ) ;
}
@Test
public void invokeAndHandle_VoidWithResponseStatus ( ) throws Exception {
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new Handler ( ) , "responseStatus" ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertTrue ( "Null return value + @ResponseStatus should result in 'request handled'" ,
mavContainer . isRequestHandled ( ) ) ;
assertEquals ( HttpStatus . BAD_REQUEST . value ( ) , response . getStatus ( ) ) ;
this . mavContainer . isRequestHandled ( ) ) ;
assertEquals ( HttpStatus . BAD_REQUEST . value ( ) , this . response . getStatus ( ) ) ;
}
@Test
public void invokeAndHandle_VoidWithHttpServletResponseArgument ( ) throws Exception {
argumentResolvers . addResolver ( new ServletResponseMethodArgumentResolver ( ) ) ;
this . argumentResolvers . addResolver ( new ServletResponseMethodArgumentResolver ( ) ) ;
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new Handler ( ) , "httpServletResponse" , HttpServletResponse . class ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
ServletInvocableHandlerMethod handlerMethod =
getHandlerMethod ( new Handler ( ) , "httpServletResponse" , HttpServletResponse . class ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertTrue ( "Null return value + HttpServletResponse arg should result in 'request handled'" ,
mavContainer . isRequestHandled ( ) ) ;
this . mavContainer . isRequestHandled ( ) ) ;
}
@Test
public void invokeAndHandle_VoidRequestNotModified ( ) throws Exception {
webRequest . getNativeRequest ( MockHttpServletRequest . class ) . addHeader ( "If-Modified-Since" , 10 * 1000 * 1000 ) ;
this . request . addHeader ( "If-Modified-Since" , 10 * 1000 * 1000 ) ;
int lastModifiedTimestamp = 1000 * 1000 ;
webRequest . checkNotModified ( lastModifiedTimestamp ) ;
this . webRequest . checkNotModified ( lastModifiedTimestamp ) ;
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new Handler ( ) , "notModified" ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertTrue ( "Null return value + 'not modified' request should result in 'request handled'" ,
mavContainer . isRequestHandled ( ) ) ;
this . mavContainer . isRequestHandled ( ) ) ;
}
// SPR-9159
@ -117,40 +118,40 @@ public class ServletInvocableHandlerMethodTests {
@@ -117,40 +118,40 @@ public class ServletInvocableHandlerMethodTests {
@Test
public void invokeAndHandle_NotVoidWithResponseStatusAndReason ( ) throws Exception {
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new Handler ( ) , "responseStatusWithReason" ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertTrue ( "When a phrase is used, the response should not be used any more " , mavContainer . isRequestHandled ( ) ) ;
assertEquals ( HttpStatus . BAD_REQUEST . value ( ) , response . getStatus ( ) ) ;
assertEquals ( "400 Bad Request" , response . getErrorMessage ( ) ) ;
assertTrue ( "When a status reason w/ used, the the request is handled " , this . mavContainer . isRequestHandled ( ) ) ;
assertEquals ( HttpStatus . BAD_REQUEST . value ( ) , this . response . getStatus ( ) ) ;
assertEquals ( "400 Bad Request" , this . response . getErrorMessage ( ) ) ;
}
@Test ( expected = HttpMessageNotWritableException . class )
public void invokeAndHandle_Exception ( ) throws Exception {
returnValueHandlers . addHandler ( new ExceptionRaisingReturnValueHandler ( ) ) ;
this . returnValueHandlers . addHandler ( new ExceptionRaisingReturnValueHandler ( ) ) ;
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new Handler ( ) , "handle" ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
fail ( "Expected exception" ) ;
}
@Test
public void invokeAndHandle_DynamicReturnValue ( ) throws Exception {
argumentResolvers . addResolver ( new RequestParamMethodArgumentResolver ( null , false ) ) ;
returnValueHandlers . addHandler ( new ViewMethodReturnValueHandler ( ) ) ;
returnValueHandlers . addHandler ( new ViewNameMethodReturnValueHandler ( ) ) ;
this . argumentResolvers . addResolver ( new RequestParamMethodArgumentResolver ( null , false ) ) ;
this . returnValueHandlers . addHandler ( new ViewMethodReturnValueHandler ( ) ) ;
this . returnValueHandlers . addHandler ( new ViewNameMethodReturnValueHandler ( ) ) ;
// Invoke without a request parameter (String return value)
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new Handler ( ) , "dynamicReturnValue" , String . class ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertNotNull ( mavContainer . getView ( ) ) ;
assertEquals ( RedirectView . class , mavContainer . getView ( ) . getClass ( ) ) ;
assertNotNull ( this . mavContainer . getView ( ) ) ;
assertEquals ( RedirectView . class , this . mavContainer . getView ( ) . getClass ( ) ) ;
// Invoke with a request parameter (RedirectView return value)
request . setParameter ( "param" , "value" ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
this . request . setParameter ( "param" , "value" ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertEquals ( "view" , mavContainer . getViewName ( ) ) ;
assertEquals ( "view" , this . mavContainer . getViewName ( ) ) ;
}
@Test
@ -166,24 +167,24 @@ public class ServletInvocableHandlerMethodTests {
@@ -166,24 +167,24 @@ public class ServletInvocableHandlerMethodTests {
private void wrapConcurrentResult_ResponseBody ( Object handler ) throws Exception {
List < HttpMessageConverter < ? > > converters = new ArrayList < HttpMessageConverter < ? > > ( ) ;
converters . add ( new StringHttpMessageConverter ( ) ) ;
returnValueHandlers . addHandler ( new RequestResponseBodyMethodProcessor ( converters ) ) ;
this . returnValueHandlers . addHandler ( new RequestResponseBodyMethodProcessor ( converters ) ) ;
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( handler , "handle" ) ;
handlerMethod = handlerMethod . wrapConcurrentResult ( "bar" ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertEquals ( "bar" , response . getContentAsString ( ) ) ;
assertEquals ( "bar" , this . response . getContentAsString ( ) ) ;
}
@Test
public void wrapConcurrentResult_ResponseEntity ( ) throws Exception {
List < HttpMessageConverter < ? > > converters = new ArrayList < HttpMessageConverter < ? > > ( ) ;
converters . add ( new StringHttpMessageConverter ( ) ) ;
returnValueHandlers . addHandler ( new HttpEntityMethodProcessor ( converters ) ) ;
this . returnValueHandlers . addHandler ( new HttpEntityMethodProcessor ( converters ) ) ;
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new ResponseEntityHandler ( ) , "handle" ) ;
handlerMethod = handlerMethod . wrapConcurrentResult ( new ResponseEntity < > ( "bar" , HttpStatus . OK ) ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertEquals ( "bar" , response . getContentAsString ( ) ) ;
assertEquals ( "bar" , this . response . getContentAsString ( ) ) ;
}
// SPR-12287
@ -194,13 +195,13 @@ public class ServletInvocableHandlerMethodTests {
@@ -194,13 +195,13 @@ public class ServletInvocableHandlerMethodTests {
converters . add ( new StringHttpMessageConverter ( ) ) ;
List < Object > advice = Arrays . asList ( mock ( ResponseBodyAdvice . class ) ) ;
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor ( converters , null , advice ) ;
returnValueHandlers . addHandler ( processor ) ;
this . returnValueHandlers . addHandler ( processor ) ;
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new ResponseEntityHandler ( ) , "handle" ) ;
handlerMethod = handlerMethod . wrapConcurrentResult ( new ResponseEntity < > ( HttpStatus . OK ) ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertEquals ( 200 , response . getStatus ( ) ) ;
assertEquals ( "" , response . getContentAsString ( ) ) ;
assertEquals ( 200 , this . response . getStatus ( ) ) ;
assertEquals ( "" , this . response . getContentAsString ( ) ) ;
}
@Test
@ -209,13 +210,13 @@ public class ServletInvocableHandlerMethodTests {
@@ -209,13 +210,13 @@ public class ServletInvocableHandlerMethodTests {
converters . add ( new StringHttpMessageConverter ( ) ) ;
List < Object > advice = Arrays . asList ( mock ( ResponseBodyAdvice . class ) ) ;
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor ( converters , null , advice ) ;
returnValueHandlers . addHandler ( processor ) ;
this . returnValueHandlers . addHandler ( processor ) ;
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod ( new ResponseEntityHandler ( ) , "handle" ) ;
handlerMethod = handlerMethod . wrapConcurrentResult ( null ) ;
handlerMethod . invokeAndHandle ( webRequest , mavContainer ) ;
handlerMethod . invokeAndHandle ( this . webRequest , this . mavContainer ) ;
assertEquals ( 200 , response . getStatus ( ) ) ;
assertEquals ( "" , response . getContentAsString ( ) ) ;
assertEquals ( 200 , this . response . getStatus ( ) ) ;
assertEquals ( "" , this . response . getContentAsString ( ) ) ;
}
private ServletInvocableHandlerMethod getHandlerMethod ( Object controller ,
@ -228,6 +229,7 @@ public class ServletInvocableHandlerMethodTests {
@@ -228,6 +229,7 @@ public class ServletInvocableHandlerMethodTests {
return handlerMethod ;
}
@SuppressWarnings ( "unused" )
private static class Handler {
@ -280,7 +282,6 @@ public class ServletInvocableHandlerMethodTests {
@@ -280,7 +282,6 @@ public class ServletInvocableHandlerMethodTests {
}
}
private static class ExceptionRaisingReturnValueHandler implements HandlerMethodReturnValueHandler {
@Override