Spring MVC测试框架详解――服务端测试(二)

2014-11-24 03:11:22 · 作者: · 浏览: 1
olver; @Configuration @EnableWebMvc @ComponentScan(basePackages = com.sishuok.mvc, useDefaultFilters = false, includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class}) }) public class MvcConfig extends WebMvcConfigurationSupport { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix(/WEB-INF/jsp/); viewResolver.setSuffix(.jsp); return viewResolver; } }

WebInitializer.java:注册相应的web.xml中的组件

package com.sishuok.config;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import java.util.EnumSet;

public class WebInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(javax.servlet.ServletContext sc) throws ServletException {

        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(AppConfig.class);
        sc.addListener(new ContextLoaderListener(rootContext));

        //2、springmvc上下文
        AnnotationConfigWebApplicationContext springMvcContext = new AnnotationConfigWebApplicationContext();
        springMvcContext.register(MvcConfig.class);
        //3、DispatcherServlet
        DispatcherServlet dispatcherServlet = new DispatcherServlet(springMvcContext);
        ServletRegistration.Dynamic dynamic = sc.addServlet(dispatcherServlet, dispatcherServlet);
        dynamic.setLoadOnStartup(1);
        dynamic.addMapping(/);

        //4、CharacterEncodingFilter
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding(utf-8);
        FilterRegistration filterRegistration =
                sc.addFilter(characterEncodingFilter, characterEncodingFilter);
        filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, /);

    }
}

对于WebInitializer,请参考《Spring4新特性——Groovy Bean定义DSL》

到此基本的配置就搞定了,接下来看看如何测试吧。

1.1 以前的测试方式

package com.sishuok.mvc.controller;
//省略import
public class UserControllerTest {

    private UserController userController;

    @Before
    public void setUp() {
        userController = new UserController();
        //安装userCtroller依赖 比如userService
    }

    @Test
    public void testView() {
        MockHttpServletRequest req = new MockHttpServletRequest();
        ModelAndView mv = userController.view(1L, req);

        ModelAndViewAssert.assertViewName(mv, user/view);
        ModelAndViewAssert.assertModelAttributeAvailable(mv, user);

    }
}

准备控制器:我们通过new方式创建一个,然后手工查找依赖注入进去(比如从spring容器获取/new的);

Mock Request:此处使用Spring提供的Mock API模拟一个HttpServletRequest,其他的Servlet API也提供了相应的Mock类,具体请查看Javadoc;

访问控制器方法:通过直接调用控制器方法进行访问,此处无法验证Spring MVC框架的类型转换、数据验证等是否正常;

ModelAndViewAssert:通过这个Assert API验证我们的返回值是否正常;

对于单元测试步骤请参考:加速Java应用开发速度3——单元/集成测试+CI

这种方式的缺点已经说过了,如不能走Spring MVC完整流程(不能走Servlet的过滤器链