22
22
import javax .servlet .ServletException ;
23
23
import javax .servlet .ServletRequest ;
24
24
import javax .servlet .ServletResponse ;
25
- import javax .servlet .http .HttpServletRequest ;
26
25
27
26
import org .junit .Before ;
28
27
import org .junit .Test ;
57
56
import static org .springframework .test .web .servlet .setup .MockMvcBuilders .*;
58
57
59
58
/**
60
- * Tests for SPR-10025 (access to request attributes via RequestContextHolder)
59
+ * Tests for SPR-10025 (access to request attributes via RequestContextHolder),
60
+ * SPR-13217 (Populate RequestAttributes before invoking Filters in MockMvc),
61
61
* and SPR-13211 (re-use of mock request from the TestContext framework).
62
62
*
63
63
* @author Rossen Stoyanchev
@@ -72,9 +72,8 @@ public class RequestContextHolderTests {
72
72
private static final String FROM_TCF_MOCK = "fromTestContextFrameworkMock" ;
73
73
private static final String FROM_MVC_TEST_DEFAULT = "fromSpringMvcTestDefault" ;
74
74
private static final String FROM_MVC_TEST_MOCK = "fromSpringMvcTestMock" ;
75
- private static final String FROM_FILTER = "fromFilter" ;
76
-
77
- private static final String ENIGMA = "puzzle" ;
75
+ private static final String FROM_REQUEST_FILTER = "fromRequestFilter" ;
76
+ private static final String FROM_REQUEST_ATTRIBUTES_FILTER = "fromRequestAttributesFilter" ;
78
77
79
78
@ Autowired
80
79
private WebApplicationContext wac ;
@@ -91,41 +90,44 @@ public class RequestContextHolderTests {
91
90
@ Autowired
92
91
private SessionScopedService sessionScopedService ;
93
92
93
+ @ Autowired
94
+ private FilterWithSessionScopedService filterWithSessionScopedService ;
95
+
94
96
private MockMvc mockMvc ;
95
97
96
98
97
99
@ Before
98
100
public void setup () {
99
- this .mockRequest .setAttribute (FROM_TCF_MOCK , ENIGMA );
101
+ this .mockRequest .setAttribute (FROM_TCF_MOCK , FROM_TCF_MOCK );
100
102
101
103
this .mockMvc = webAppContextSetup (this .wac )
102
- .addFilter (new AbcFilter () )
103
- .defaultRequest (get ("/" ).requestAttr (FROM_MVC_TEST_DEFAULT , ENIGMA ))
104
+ .addFilters (new RequestFilter (), new RequestAttributesFilter (), this . filterWithSessionScopedService )
105
+ .defaultRequest (get ("/" ).requestAttr (FROM_MVC_TEST_DEFAULT , FROM_MVC_TEST_DEFAULT ))
104
106
.alwaysExpect (status ().isOk ())
105
107
.build ();
106
108
}
107
109
108
110
@ Test
109
111
public void singletonController () throws Exception {
110
- this .mockMvc .perform (get ("/singletonController" ).requestAttr (FROM_MVC_TEST_MOCK , ENIGMA ));
112
+ this .mockMvc .perform (get ("/singletonController" ).requestAttr (FROM_MVC_TEST_MOCK , FROM_MVC_TEST_MOCK ));
111
113
}
112
114
113
115
@ Test
114
116
public void requestScopedController () throws Exception {
115
117
assertTrue ("request-scoped controller must be a CGLIB proxy" , AopUtils .isCglibProxy (this .requestScopedController ));
116
- this .mockMvc .perform (get ("/requestScopedController" ).requestAttr (FROM_MVC_TEST_MOCK , ENIGMA ));
118
+ this .mockMvc .perform (get ("/requestScopedController" ).requestAttr (FROM_MVC_TEST_MOCK , FROM_MVC_TEST_MOCK ));
117
119
}
118
120
119
121
@ Test
120
122
public void requestScopedService () throws Exception {
121
123
assertTrue ("request-scoped service must be a CGLIB proxy" , AopUtils .isCglibProxy (this .requestScopedService ));
122
- this .mockMvc .perform (get ("/requestScopedService" ).requestAttr (FROM_MVC_TEST_MOCK , ENIGMA ));
124
+ this .mockMvc .perform (get ("/requestScopedService" ).requestAttr (FROM_MVC_TEST_MOCK , FROM_MVC_TEST_MOCK ));
123
125
}
124
126
125
127
@ Test
126
128
public void sessionScopedService () throws Exception {
127
129
assertTrue ("session-scoped service must be a CGLIB proxy" , AopUtils .isCglibProxy (this .sessionScopedService ));
128
- this .mockMvc .perform (get ("/sessionScopedService" ).requestAttr (FROM_MVC_TEST_MOCK , ENIGMA ));
130
+ this .mockMvc .perform (get ("/sessionScopedService" ).requestAttr (FROM_MVC_TEST_MOCK , FROM_MVC_TEST_MOCK ));
129
131
}
130
132
131
133
@@ -167,6 +169,11 @@ public SessionScopedService sessionScopedService() {
167
169
public ControllerWithSessionScopedService controllerWithSessionScopedService () {
168
170
return new ControllerWithSessionScopedService ();
169
171
}
172
+
173
+ @ Bean
174
+ public FilterWithSessionScopedService filterWithSessionScopedService () {
175
+ return new FilterWithSessionScopedService ();
176
+ }
170
177
}
171
178
172
179
@ RestController
@@ -182,7 +189,7 @@ public void handle() {
182
189
private static class RequestScopedController {
183
190
184
191
@ Autowired
185
- private HttpServletRequest request ;
192
+ private ServletRequest request ;
186
193
187
194
188
195
@ RequestMapping ("/requestScopedController" )
@@ -195,7 +202,7 @@ public void handle() {
195
202
private static class RequestScopedService {
196
203
197
204
@ Autowired
198
- private HttpServletRequest request ;
205
+ private ServletRequest request ;
199
206
200
207
201
208
void process () {
@@ -206,7 +213,7 @@ void process() {
206
213
private static class SessionScopedService {
207
214
208
215
@ Autowired
209
- private HttpServletRequest request ;
216
+ private ServletRequest request ;
210
217
211
218
212
219
void process () {
@@ -242,11 +249,35 @@ public void handle() {
242
249
}
243
250
}
244
251
245
- private static class AbcFilter extends GenericFilterBean {
252
+ private static class FilterWithSessionScopedService extends GenericFilterBean {
253
+
254
+ @ Autowired
255
+ private SessionScopedService service ;
256
+
257
+
258
+ @ Override
259
+ public void doFilter (ServletRequest request , ServletResponse response , FilterChain chain ) throws IOException , ServletException {
260
+ this .service .process ();
261
+ assertRequestAttributes (request );
262
+ assertRequestAttributes ();
263
+ chain .doFilter (request , response );
264
+ }
265
+ }
266
+
267
+ private static class RequestFilter extends GenericFilterBean {
268
+
269
+ @ Override
270
+ public void doFilter (ServletRequest request , ServletResponse response , FilterChain chain ) throws IOException , ServletException {
271
+ request .setAttribute (FROM_REQUEST_FILTER , FROM_REQUEST_FILTER );
272
+ chain .doFilter (request , response );
273
+ }
274
+ }
275
+
276
+ private static class RequestAttributesFilter extends GenericFilterBean {
246
277
247
278
@ Override
248
279
public void doFilter (ServletRequest request , ServletResponse response , FilterChain chain ) throws IOException , ServletException {
249
- request . setAttribute (FROM_FILTER , ENIGMA );
280
+ RequestContextHolder . getRequestAttributes (). setAttribute (FROM_REQUEST_ATTRIBUTES_FILTER , FROM_REQUEST_ATTRIBUTES_FILTER , RequestAttributes . SCOPE_REQUEST );
250
281
chain .doFilter (request , response );
251
282
}
252
283
}
@@ -258,13 +289,13 @@ private static void assertRequestAttributes() {
258
289
assertRequestAttributes (((ServletRequestAttributes ) requestAttributes ).getRequest ());
259
290
}
260
291
261
- private static void assertRequestAttributes (HttpServletRequest request ) {
262
- // TODO [SPR-13211] Assert that FOO is ENIGMA, instead of NULL.
263
- // assertThat(this.request.getAttribute(FOO), is(ENIGMA));
292
+ private static void assertRequestAttributes (ServletRequest request ) {
293
+ // TODO [SPR-13211] Assert that FROM_TCF_MOCK is FROM_TCF_MOCK, instead of NULL.
264
294
assertThat (request .getAttribute (FROM_TCF_MOCK ), is (nullValue ()));
265
- assertThat (request .getAttribute (FROM_MVC_TEST_DEFAULT ), is (ENIGMA ));
266
- assertThat (request .getAttribute (FROM_MVC_TEST_MOCK ), is (ENIGMA ));
267
- assertThat (request .getAttribute (FROM_FILTER ), is (ENIGMA ));
295
+ assertThat (request .getAttribute (FROM_MVC_TEST_DEFAULT ), is (FROM_MVC_TEST_DEFAULT ));
296
+ assertThat (request .getAttribute (FROM_MVC_TEST_MOCK ), is (FROM_MVC_TEST_MOCK ));
297
+ assertThat (request .getAttribute (FROM_REQUEST_FILTER ), is (FROM_REQUEST_FILTER ));
298
+ assertThat (request .getAttribute (FROM_REQUEST_ATTRIBUTES_FILTER ), is (FROM_REQUEST_ATTRIBUTES_FILTER ));
268
299
}
269
300
270
301
}
0 commit comments