【问题标题】:How to test Spring HandlerInterceptor Mapping如何测试 Spring HandlerInterceptor Mapping
【发布时间】:2014-06-10 12:01:21
【问题描述】:

我正在实现一个HandlerInterceptor,它需要在处理对多个路径的请求之前/之后执行业务逻辑。我想通过模拟请求句柄生命周期来测试拦截器的执行。

拦截器的注册方式如下:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/test*"/>
        <bean class="x.y.z.TestInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

我不仅想测试preHandlepostHandle 方法,还想测试到路径的映射。

【问题讨论】:

    标签: spring-mvc junit mapping interceptor spring-test


    【解决方案1】:

    下面的测试可以在JUnit和spring-test的帮助下编写:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath*:META-INF/spring.xml", ... })
    public class InterceptorTest {
    
    @Autowired
    private RequestMappingHandlerAdapter handlerAdapter;
    
    @Autowired
    private RequestMappingHandlerMapping handlerMapping;
    
    @Test
    public void testInterceptor() throws Exception{
    
    
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setRequestURI("/test");
        request.setMethod("GET");
    
    
        MockHttpServletResponse response = new MockHttpServletResponse();
    
        HandlerExecutionChain handlerExecutionChain = handlerMapping.getHandler(request);
    
        HandlerInterceptor[] interceptors = handlerExecutionChain.getInterceptors();
    
        for(HandlerInterceptor interceptor : interceptors){
            interceptor.preHandle(request, response, handlerExecutionChain.getHandler());
        }
    
        ModelAndView mav = handlerAdapter. handle(request, response, handlerExecutionChain.getHandler());
    
        for(HandlerInterceptor interceptor : interceptors){
            interceptor.postHandle(request, response, handlerExecutionChain.getHandler(), mav);
        }
    
        assertEquals(200, response.getStatus());
        //assert the success of your interceptor
    
    }
    

    HandlerExecutionChain 填充了特定请求的所有映射拦截器。如果映射失败,拦截器将不会出现在列表中,因此不会执行,最后的断言将失败。

    【讨论】:

      【解决方案2】:

      Spring Framework 以 Spring MVC Test Framework 的形式为测试 Spring MVC 配置和组件提供了专门的支持,自 Spring Framework 3.2 起可用(自 Spring Framework 3.1 起作为单独的 spring-test-mvc 项目提供)。

      在第一个链接中,您将找到许多有关如何使用 Spring MVC 测试框架的示例。此外,您还可以在 SpringOne 2GX 的 Spring 3.1 and MVC Testing SupportTesting Web Apps with Spring Framework 3.2 演示文稿中找到 Rossen Stoyanchev(Spring MVC 测试框架的作者)的幻灯片。

      我相信这些资源应该可以帮助您简洁地编写测试,但是如果您仍然需要帮助,请随时在此处发帖。

      问候,

      Sam(Spring TestContext 框架的作者

      【讨论】:

      • 感谢您向我指出这个 mvc 测试框架!我习惯于从 3.1 时代开始自己嘲笑 mvc……应该使测试更加一致!
      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 2011-12-21
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多