gpt4 book ai didi

java - 在 Spring 3.1 中,如何测试 Controller 的 url?

转载 作者:行者123 更新时间:2023-11-30 04:38:55 25 4
gpt4 key购买 nike

在 spring (3.0) 的早期版本中,可以使用 ApplicationContext 中的 RequestMappingHandlerAdapter 和 HandlerMapping 对象通过正确的 url 来测试 Controller 。然而,在 Spring 3.1 中,情况发生了变化,我用来完成这项工作的代码不再起作用。

如何在 Spring 3.1 中测试 Spring Controller url?例如,我想编写如下所示的代码:

ModelAndView modelAndView = handle("GET", "/businesses");

这样,除了 Controller 的操作逻辑之外,我还可以测试我的映射。

特别是,我最感兴趣的是确保我可以传递 session 属性并将它们正确传递到我的 Controller 操作的 @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-test-mvc目前为 1.0.0M1,但计划与较新的 Spring MVC 版本一起打包。它应该能够很容易地处理您正在寻找的情况,您的测试最终将如下所示:

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,所以如果您仍然想继续使用您的方法,您能否准确指出什么不起作用 - 听起来正常请求正在通过,但 session 属性似乎没有绑定(bind)?

关于java - 在 Spring 3.1 中,如何测试 Controller 的 url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12775539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com