如何测试Spring HandlerInterceptor Mapping

时间:2014-06-10 12:01:21

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

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

以下是拦截器的注册方式:

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

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

2 个答案:

答案 0 :(得分:9)

可以在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填充了特定请求的所有映射拦截器。如果映射失败,拦截器将不会出现在列表中,因此不会执行,并且最后的断言将失败。

答案 1 :(得分:3)

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

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

我相信这些资源可以帮助您简明扼要地编写测试,但如果您仍然需要帮助,请随时回复。

此致

Sam( Spring TestContext Framework的作者