Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring3.1中,如何测试控制器的URL?_Java_Spring_Unit Testing_Spring Mvc_Controller - Fatal编程技术网

Java 在Spring3.1中,如何测试控制器的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

在以前版本的spring(3.0)中,可以使用ApplicationContext中的RequestMappingHandlerAdapter和HandlerMapping对象,通过正确的URL测试控制器。然而,在Spring3.1中,情况发生了变化,我用来使这项工作正常进行的代码不再起作用

如何在Spring3.1中测试Spring控制器URL?例如,我想编写如下代码:

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测试框架。在我看来,没有理由不这么做。谢谢