我们展示了如何在springMVC应用程序中使用HandlerInterceptorAdapter,随着映射变得越来越复杂,您应该考虑编写单元测试来验证是否将正确的处理程序应用到URL。SpringFramework3.2版本包含对测试SpringMVC应用程序的一流支持,分为两类测试;集成和模拟。集成方法更全面地进行集成测试,因为它加载整个配置,而后者只模拟控制器而不加载配置。由于TestContext框架缓存了spring配置,所以您的第一个测试会受到影响,但之后的每个测试都应该相当快。下面的示例将展示如何验证请求是否包含执行链中的处理程序。
在我们关于如何使用spring处理程序拦截器的帖子中,我们注册了NavigationHandlerInterceptor,它应该针对每个请求执行,但以/api开头的请求除外:
@Configuration
public class ApplicationConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(final InterceptorRegistry registry) {
registry.addInterceptor(new NavigationHandlerInterceptor())
.addPathPatterns("/**").excludePathPatterns("/api/**");
}
}
一旦spring加载context,我们就可以获得applicationContext上的句柄来获取RequestMappingHandlerMapping。RequestMappingHandlerMapping提供了一种获取@Controllers和方法级别上所有@RequestMapping的方法。接下来,我们将生成一个带有随机URL的MockHttpServletRequest,并查找给定请求的处理程序。因为HandlerExecutionChain中可能包含多个处理程序。getInterceptors(),我们想验证NavigationHandlerInterceptor是否在执行路径中,因此我们将按类类型过滤结果。如果您使用的是java8,您可以使用java8Optional关闭番石榴选项。第二个测试是验证/api请求不包含拦截器,并匹配为排除PathPathPatterns而提供的模式。
@Configuration
@WebAppConfiguration
@SpringApplicationConfiguration(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class HandlerInterceptorTest extends BaseSpringIntegration {
@Autowired
ApplicationContext applicationContext;
@Test
public void interceptor_request_all() throws Exception {
RequestMappingHandlerMapping mapping = (RequestMappingHandlerMapping) applicationContext
.getBean("requestMappingHandlerMapping");
assertNotNull(mapping);
MockHttpServletRequest request = new MockHttpServletRequest("GET",
"/test");
HandlerExecutionChain chain = mapping.getHandler(request);
Optional<NavigationHandlerInterceptor> containsHandler = FluentIterable
.from(Arrays.asList(chain.getInterceptors()))
.filter(NavigationHandlerInterceptor.class).first();
assertTrue(containsHandler.isPresent());
}
@Test
public void interceptor_request_api() throws Exception {
RequestMappingHandlerMapping mapping = (RequestMappingHandlerMapping) applicationContext
.getBean("requestMappingHandlerMapping");
assertNotNull(mapping);
MockHttpServletRequest request = new MockHttpServletRequest("GET",
"/api/whatever");
HandlerExecutionChain chain = mapping.getHandler(request);
Optional<NavigationHandlerInterceptor> containsHandler = FluentIterable
.from(Arrays.asList(chain.getInterceptors()))
.filter(NavigationHandlerInterceptor.class).first();
assertFalse(containsHandler.isPresent());
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : http://www.leveluplunch.com/blog/2014/07/09/how-to-test-spring-mvc-handler-interceptors/
内容来源于网络,如有侵权,请联系作者删除!