Spring MockMvc重定向无法正常工作

时间:2017-08-07 11:05:20

标签: spring-mvc spring-security spring-test spring-test-mvc

我正在尝试使用以下代码模拟帖子请求。

我正在测试一个Spring安全登录请求。

$(function() { 
    $("#btnSave").click(function() { 
        html2canvas($("#map"), {
            onrendered: function(canvas) {
                theCanvas = canvas;
                document.body.appendChild(canvas);

                // Convert and download as image 
                Canvas2Image.saveAsPNG(canvas); 
                $("#img-out").append(canvas);
                // Clean up 
                //document.body.removeChild(canvas);
            }
        });
    });
}); 

var map = new GMaps({
    div: '#map',
    lat: -12.043333,
    lng: -77.028333
});

代码工作正常,登录成功后,我将重定向到另一个控制器。

MockMvc mvc = MockMvcBuilders.webAppContextSetup(context).addFilter(springSecurityFilterChain)
                .apply(springSecurity())
                .build();

    MvcResult mvcResult = mvc.perform(post("/j_spring_security_check?api=true").param("userName", USERNAME)
                    .param("password", PASSWORD)).andReturn();

当我运行测试时,我得到以下日志。重定向不会发生,并且未调用映射到/ myURL的控制器。

    @Override
        public void onAuthenticationSuccess(HttpServletRequest request,
                HttpServletResponse response, Authentication authentication) throws IOException,
                ServletException {

RequestDispatcher rd = request.getRequestDispatcher("/myURL");
        rd.forward(request, response);

    }

没有报告错误。

我错过了什么吗?使用MockMvc时不会发生重定向吗?

1 个答案:

答案 0 :(得分:4)

  

使用MockMvc时不会发生重定向吗?

NO。

以下内容直接来自参考手册的Differences between Out-of-Container and End-to-End Integration Tests部分。

  

可能会让您感到意外的是,默认情况下没有上下文路径,没有jsessionid cookie,没有转发,错误或异步调度,因此没有实际的JSP呈现。相反,“转发”和“重定向”的URL保存在MockHttpServletResponse中,可以满足期望。

因此,您所能做的就是验证转发发生在真实的Servlet容器中,并通过调用andExpect(forwardedUrl("/myURL"))而不是andReturn()来实现。< / p>

请注意,forwardedUrlMockMvcResultMatchers中的静态方法。