概述
对项目进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,为了测试Controller而不需要启动服务器,我们需要一些Servlet相关的模拟对象,比如MockMVC、MockHttpServletRequest、MockHttpServletResponse、MockHttpSession等。
简介
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一且方便。
运行配置
用到的注解
- RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;
- WebAppConfiguration: 使用这个Annotate会在跑单元测试的时候真实的启一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;
- ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;
例:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:spring/applicationContext-springmvc.xml", "classpath:spring/applicationContext-service.xml"})
public class AccountControllerTest {
protected MockMvc mockMvc;
@Autowired
protected WebApplicationContext wac;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象
}
@Test
public void updateAccount() throws Exception {
String responseString = mockMvc.perform(
post("/update-account") //请求的url,请求的方法是get
.contentType(MediaType.APPLICATION_JSON)//数据的格式
.param("username", "auditor") //添加参数(可以添加多个)
.param("passwd", "123456") //添加参数(可以添加多个)
.param("newpasswd","1234abcd@")
.param("confirmpasswd","123456")
)
.andExpect(status().isOk()) //返回的状态是200
.andDo(print()) //打印出请求和相应的内容
.andReturn().getResponse().getContentAsString(); //将相应的数据转换为字符串
System.out.println("-----返回的json = " + responseString);
}
}
1 、mockMvc调用perform,调用controller的业务处理逻辑
2 、perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式。
3 、使用StatusResultMatchers对请求结果进行验证
4 、使用ContentResultMatchers对请求返回的内容进行验证