Java 在Spring3.1中,如何测试控制器的URL?
在以前版本的spring(3.0)中,可以使用ApplicationContext中的RequestMappingHandlerAdapter和HandlerMapping对象,通过正确的URL测试控制器。然而,在Spring3.1中,情况发生了变化,我用来使这项工作正常进行的代码不再起作用 如何在Spring3.1中测试Spring控制器URL?例如,我想编写如下代码:Java 在Spring3.1中,如何测试控制器的URL?,java,spring,unit-testing,spring-mvc,controller,Java,Spring,Unit Testing,Spring Mvc,Controller,在以前版本的spring(3.0)中,可以使用ApplicationContext中的RequestMappingHandlerAdapter和HandlerMapping对象,通过正确的URL测试控制器。然而,在Spring3.1中,情况发生了变化,我用来使这项工作正常进行的代码不再起作用 如何在Spring3.1中测试Spring控制器URL?例如,我想编写如下代码: ModelAndView modelAndView = handle("GET", "/businesses"); xml
ModelAndView modelAndView = handle("GET", "/businesses");
xmlConfigSetup("classpath:/META-INF/spring/web/webmvc-config.xml")
.configureWebAppRootDir("src/main/webapp", false).build()
.perform(get("/businesses").param("name", "param1"))
.andExpect(status().isOk())
.andExpect(view().name("viewname"));
这样,除了控制器的动作逻辑之外,我还测试了我的映射
特别是,我最感兴趣的是确保能够传递会话属性,并将它们正确地传递给控制器操作的@Valid注释
有没有办法用Spring3.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.1类和控制器,下面是一个示例:
@Test
public void testSave() {
Account account = new Account();
BindingResult result =
new BeanPropertyBindingResult(account, "account");
AccountManager mgr = createMock(AccountManager.class);
mgr.saveOrUpdate(account);
replay(mgr);
AccountController contrlr = new AccountController(mgr);
String view = contrlr.save(account, result);
assertEquals("redirect:accounts", view);
verify(mgr);
}
希望有帮助 这是我在Spring 3.1中使用的测试用例之一。希望能满足您的要求
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml" })
public class ControllerTest {
@Autowired
private RequestMappingHandlerAdapter handleAdapter;
@Autowired
private RequestMappingHandlerMapping handlerMapping;
@Test
public void playerControllerTest() throws Exception{
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setRequestURI("/players.show");
request.setMethod("GET");
Object handler = handlerMapping.getHandler(request).getHandler();
ModelAndView mav = handleAdapter.handle(request, response,handler);
ModelAndViewAssert.assertViewName(mav,"players");
}
}
相反,让我推荐目前在1.0.0M1中,但计划与较新的Spring MVC版本打包的版本。它应该能够很容易地处理您正在寻找的情况,您的测试结果如下所示:
ModelAndView modelAndView = handle("GET", "/businesses");
xmlConfigSetup("classpath:/META-INF/spring/web/webmvc-config.xml")
.configureWebAppRootDir("src/main/webapp", false).build()
.perform(get("/businesses").param("name", "param1"))
.andExpect(status().isOk())
.andExpect(view().name("viewname"));
您的测试看起来确实适合3.1,因此如果您仍然想继续使用您的方法,您能否准确指出哪些方法不起作用-听起来像是正常的请求正在进行,但会话属性似乎没有绑定?我非常清楚,您可以像任何其他pojo一样调用控制器的方法,但这并不测试映射。因此,如果映射是错误的,那么在您在tomcat中尝试之前,它们将不会经过测试。除了测试控制器的逻辑之外,我更愿意对映射进行回归测试。这实际上与我正在使用的代码非常相似。如果将对象放入会话属性中,则它不起作用。会话将无法正确绑定到操作。相反,该对象似乎是新创建的。是的,会话属性没有正确绑定。这种方法过去在Spring3.0中工作得很好,但现在已经停止工作了。可能是虫子吗?传递到控制器中的对象现在似乎是空实例。使用SpringTestMVC方法,我可以像以前一样传递会话对象吗?如果是这样的话,我切换没有问题。这个项目只有2天的历史,我还没有写很多代码。在我全力以赴之前,我仍然在想办法。怀疑这是否是一个bug-Spring MVC代码在3.0和3.1之间发生了很大变化,处理程序不再是控制器,它实际上是最后的
@RequestMapped
方法。您的代码对于Spring3.0更不正确,因为只有3.1.0才引入了RequestMappingHandlerAdapter
。我假设会话属性在mvc测试中应该正确-这是一个示例-这是关于这个项目的更多信息-我的代码看起来像3.1.0的原因是我一直在尝试让它在3.1中工作。之前的代码是从一个3.0项目中提取的,所以请相信我-它过去工作得很好。我改变它的唯一原因是它停止工作了。当我做出上面的更改时,它只是“某种程度上”起了作用——但对于属性它仍然不起作用(这是一个大问题)。我将使用新的SpringMVC测试框架。在我看来,没有理由不这么做。谢谢