Spring MVC HandlerInterceptorAdapter测试

x33g5p2x  于2022-10-13 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(628)

我们展示了如何在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());
    }
}

相关文章