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

2014-11-24 03:11:22 · 作者: · 浏览: 6
、SpringMVC的类型转换、数据验证、数据绑定、拦截器等等),如果做基本的测试没问题,这种方式就是纯粹的单元测试,我们想要的功能其实是一种集成测试,不过后续部分不区分。

1.2 安装测试环境

spring mvc测试框架提供了两种方式,独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。

独立测试方式

public class UserControllerStandaloneSetupTest {
    private MockMvc mockMvc;
    @Before
    public void setUp() {
        UserController userController = new UserController();
        mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
    }
}

1、首先自己创建相应的控制器,注入相应的依赖

2、通过MockMvcBuilders.standaloneSetup模拟一个Mvc测试环境,通过build得到一个MockMvc

3、MockMvc:是我们以后测试时经常使用的API,后边介绍

集成Web环境方式

//XML风格
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration(value = src/main/webapp)
@ContextHierarchy({
        @ContextConfiguration(name = parent, locations = classpath:spring-config.xml),
        @ContextConfiguration(name = child, locations = classpath:spring-mvc.xml)
})

//注解风格
//@RunWith(SpringJUnit4ClassRunner.class)
//@WebAppConfiguration(value = src/main/webapp)
//@ContextHierarchy({
//        @ContextConfiguration(name = parent, classes = AppConfig.class),
//        @ContextConfiguration(name = child, classes = MvcConfig.class)
//})
public class UserControllerWebAppContextSetupTest {

    @Autowired
    private WebApplicationContext wac;
    private MockMvc mockMvc;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }
}

1、@WebAppConfiguration:测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的;value指定web应用的根;

2、@ContextHierarchy:指定容器层次,即spring-config.xml是父容器,而spring-mvc.xml是子容器,请参考《第三章 DispatcherServlet详解 ——跟开涛学SpringMVC》

3、通过@Autowired WebApplicationContext wac:注入web环境的ApplicationContext容器;

4、然后通过MockMvcBuilders.webAppContextSetup(wac).build()创建一个MockMvc进行测试;

到此测试环境就搭建完成了,根据需要选择使用哪种方式即可。相关配置请前往github查看。

1.3、HelloWorld

    @Test
    public void testView() throws Exception {
        MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(/user/1))
                .andExpect(MockMvcResultMatchers.view().name(user/view))
                .andExpect(MockMvcResultMatchers.model().attributeExists(user))
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        
        Assert.assertNotNull(result.getModelAndView().getModel().get(user));
    }

1、mockMvc.perform执行一个请求;

2、MockMvcRequestBuilders.get(/user/1)构造一个请求

3、ResultActions.andExpect添加执行完成后的断言

4、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。

5、ResultActions.andReturn表示执行完成后返回相应的结果。

整个测试过程非常有规律:

1、准备测试环境

2、通过MockMvc执行请求

3.1、添加验证断言

3.2、添加结果处理器

3.3、得到MvcResult进行自定义断言/进行下一步的异步请求

4、卸载测试环境

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

1.4、了解测试API

Spring mvc测试框架提供了测试MVC需要的API,主要包括Servlet/JSP Mock、MockMvcBuilder、MockMvc、RequestBuilder、ResultMatcher、ResultHandler、MvcResult等。另外提供了几个静态工厂方法便于测试:MockMvcBuilders、MockMvcRequestBuilders、MockMvcResultMatchers、MockMvcResultHandlers。在使用时请使用静态方法导入方便测试,如:

import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

Servl