在Spring的早期版本(3.0)中,可以使用ApplicationContext中的RequestMappingHandlerAdapter和HandlerMapping對象,通過正確的URL測試控制器。但是,在Spring 3.1中,事情發生了變化,我用來使這個工作的代碼不再起作用。有了Spring 3.1,你如何測試你的控制器的URL?
你如何在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());
}
是的,會話屬性綁定不正確。這種方法在Spring 3.0中工作得很好,但它已停止工作。它可能是一個錯誤?傳遞給控制器的對象現在似乎是空實例。使用spring-test-mvc方法,我可以像以前一樣傳遞會話對象嗎?如果是這樣,我沒有問題切換。該項目只有2天 - 我還沒有寫很多代碼。在我全速前進之前,我仍然在搞清楚。 – egervari
懷疑它可能是一個bug - Spring MVC代碼在3.0和3.1之間已經發生了很大的變化,處理程序不再是控制器,它實際上是最終的@ RequestMapped方法。你的代碼對於Spring 3.0來說更加不正確,因爲RequestMappingHandlerAdapter只在3.1.0中引入。我假設會話屬性應該正確使用mvc-test - 這裏是一個示例 - https:// github。com/SpringSource/spring-test-mvc/blob/master/src/test/java/org/springframework/test/web/server/samples/standalone/resultmatchers/SessionAttributeAssertionTests.java –
這是關於這個項目的更多信息 - http://rossenstoyanchev.org/blog/2012/06/28/early-milestone-of-spring-test-mvc/ –