我正在实现一个HandlerInterceptor
,需要在处理对多个路径的请求之前/之后执行业务逻辑。我想通过模拟请求句柄生命周期来测试Interceptor的执行。
以下是拦截器的注册方式:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/test*"/>
<bean class="x.y.z.TestInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
我不仅要测试preHandle
和postHandle
方法,还要测试到路径的映射。
答案 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 Support和Testing Web Apps with Spring Framework 3.2演示文稿中找到Rossen Stoyanchev( Spring MVC测试框架的作者)的幻灯片。
我相信这些资源可以帮助您简明扼要地编写测试,但如果您仍然需要帮助,请随时回复。
此致
Sam( Spring TestContext Framework的作者)