Spring (3.0) の以前のバージョンでは、ApplicationContext の RequestMappingHandlerAdapter および HandlerMapping オブジェクトを使用して、正しい URL を介してコントローラーをテストすることができました。しかし、Spring 3.1 では状況が変わり、これを機能させるために使用していたコードは機能しなくなりました。
Spring 3.1 で Spring コントローラーの URL をどのようにテストしますか? たとえば、次のようなコードを書きたいと思います。
ModelAndView modelAndView = handle("GET", "/businesses");
このようにして、コントローラーのアクション ロジックに加えてマッピングをテストしています。
特に、セッション属性を渡して、それらをコントローラー アクションの @Valid アノテーションに正しく渡すことができるようにすることに最も関心があります。
Spring 3.1 でこれを達成する方法はありますか?
これは私が使用していたコードです:
protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response) throws Exception {
final HandlerMapping handlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
final HandlerExecutionChain handler = handlerMapping.getHandler(request);
assertNotNull("No handler found for request, check you request mapping", handler);
final Object controller = handler.getHandler();
final HandlerInterceptor[] interceptors = handlerMapping.getHandler(request).getInterceptors();
for (HandlerInterceptor interceptor : interceptors) {
final boolean carryOn = interceptor.preHandle(request, response, controller);
if (!carryOn) {
return null;
}
}
return handlerAdapter.handle(request, response, controller);
}
protected ModelAndView handle(String method, String path, String queryString) throws Exception {
request.setMethod(method);
request.setRequestURI(path);
if(queryString != null) {
String[] parameters = queryString.split("&");
for(String parameter : parameters) {
String[] pair = parameter.split("=");
if(pair.length == 2) {
request.setParameter(pair[0], pair[1]);
} else {
request.setParameter(pair[0], "");
}
}
}
return handle(request, response);
}
protected ModelAndView handle(String method, String path, String attribute, Object object) throws Exception {
MockHttpSession session = new MockHttpSession();
session.setAttribute(attribute, object);
request.setSession(session);
return handle(method, path, null);
}
protected ModelAndView handle(String method, String path) throws Exception {
return handle(method, path, null);
}
protected void assertContentType(ModelAndView modelAndView, String contentType) {
assertEquals(contentType, modelAndView.getView().getContentType());
}