1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.web.servlet.mvc.method.annotation;
18
19 import java.lang.reflect.Method;
20
21 import org.junit.Before;
22 import org.junit.Test;
23
24 import org.springframework.core.MethodParameter;
25 import org.springframework.mock.web.test.MockHttpServletRequest;
26 import org.springframework.ui.ModelMap;
27 import org.springframework.web.context.request.ServletWebRequest;
28 import org.springframework.web.method.support.ModelAndViewContainer;
29 import org.springframework.web.servlet.ModelAndView;
30 import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;
31 import org.springframework.web.servlet.view.RedirectView;
32
33 import static org.junit.Assert.*;
34
35
36
37
38
39
40 public class ModelAndViewMethodReturnValueHandlerTests {
41
42 private ModelAndViewMethodReturnValueHandler handler;
43
44 private ModelAndViewContainer mavContainer;
45
46 private ServletWebRequest webRequest;
47
48 private MethodParameter returnParamModelAndView;
49
50 @Before
51 public void setUp() throws Exception {
52 this.handler = new ModelAndViewMethodReturnValueHandler();
53 this.mavContainer = new ModelAndViewContainer();
54 this.webRequest = new ServletWebRequest(new MockHttpServletRequest());
55 this.returnParamModelAndView = getReturnValueParam("modelAndView");
56 }
57
58 @Test
59 public void supportsReturnType() throws Exception {
60 assertTrue(handler.supportsReturnType(returnParamModelAndView));
61 assertFalse(handler.supportsReturnType(getReturnValueParam("viewName")));
62 }
63
64 @Test
65 public void handleViewReference() throws Exception {
66 ModelAndView mav = new ModelAndView("viewName", "attrName", "attrValue");
67 handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest);
68
69 assertEquals("viewName", mavContainer.getView());
70 assertEquals("attrValue", mavContainer.getModel().get("attrName"));
71 }
72
73 @Test
74 public void handleViewInstance() throws Exception {
75 ModelAndView mav = new ModelAndView(new RedirectView(), "attrName", "attrValue");
76 handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest);
77
78 assertEquals(RedirectView.class, mavContainer.getView().getClass());
79 assertEquals("attrValue", mavContainer.getModel().get("attrName"));
80 }
81
82 @Test
83 public void handleNull() throws Exception {
84 handler.handleReturnValue(null, returnParamModelAndView, mavContainer, webRequest);
85
86 assertTrue(mavContainer.isRequestHandled());
87 }
88
89 @Test
90 public void handleRedirectAttributesWithViewReference() throws Exception {
91 RedirectAttributesModelMap redirectAttributes = new RedirectAttributesModelMap();
92 mavContainer.setRedirectModel(redirectAttributes);
93
94 ModelAndView mav = new ModelAndView(new RedirectView(), "attrName", "attrValue");
95 handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest);
96
97 assertEquals(RedirectView.class, mavContainer.getView().getClass());
98 assertEquals("attrValue", mavContainer.getModel().get("attrName"));
99 assertSame("RedirectAttributes should be used if controller redirects", redirectAttributes,
100 mavContainer.getModel());
101 }
102
103 @Test
104 public void handleRedirectAttributesWithViewName() throws Exception {
105 RedirectAttributesModelMap redirectAttributes = new RedirectAttributesModelMap();
106 mavContainer.setRedirectModel(redirectAttributes);
107
108 ModelAndView mav = new ModelAndView("redirect:viewName", "attrName", "attrValue");
109 handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest);
110
111 ModelMap model = mavContainer.getModel();
112 assertEquals("redirect:viewName", mavContainer.getViewName());
113 assertEquals("attrValue", model.get("attrName"));
114 assertSame(redirectAttributes, model);
115 }
116
117 @Test
118 public void handleRedirectAttributesWithCustomPrefix() throws Exception {
119 RedirectAttributesModelMap redirectAttributes = new RedirectAttributesModelMap();
120 mavContainer.setRedirectModel(redirectAttributes);
121
122 ModelAndView mav = new ModelAndView("myRedirect:viewName", "attrName", "attrValue");
123 handler.setRedirectPatterns("myRedirect:*");
124 handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest);
125
126 ModelMap model = mavContainer.getModel();
127 assertEquals("myRedirect:viewName", mavContainer.getViewName());
128 assertEquals("attrValue", model.get("attrName"));
129 assertSame(redirectAttributes, model);
130 }
131
132 @Test
133 public void handleRedirectAttributesWithoutRedirect() throws Exception {
134 RedirectAttributesModelMap redirectAttributes = new RedirectAttributesModelMap();
135 mavContainer.setRedirectModel(redirectAttributes);
136
137 ModelAndView mav = new ModelAndView();
138 handler.handleReturnValue(mav, returnParamModelAndView, mavContainer, webRequest);
139
140 ModelMap model = mavContainer.getModel();
141 assertEquals(null, mavContainer.getView());
142 assertTrue(mavContainer.getModel().isEmpty());
143 assertNotSame("RedirectAttributes should not be used if controller doesn't redirect", redirectAttributes, model);
144 }
145
146
147 private MethodParameter getReturnValueParam(String methodName) throws Exception {
148 Method method = getClass().getDeclaredMethod(methodName);
149 return new MethodParameter(method, -1);
150 }
151
152 @SuppressWarnings("unused")
153 ModelAndView modelAndView() {
154 return null;
155 }
156
157 @SuppressWarnings("unused")
158 String viewName() {
159 return null;
160 }
161
162 }