一、简介
为何使用MockMvc? 对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,所以为了可以对Controller进行测试,我们引入了MockMVC。 MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
二、测试逻辑
MockMvcBuilder构造MockMvc的构造器;
mockMvc调用perform,执行一个RequestBuilder请求,调用controller的业务处理逻辑;
perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式;
使用StatusResultMatchers对请求结果进行验证;
使用ContentResultMatchers对请求返回的内容进行验证;
三.示例代码
@RunWith(SpringJUnit4ClassRunner
.class)
@WebAppConfiguration
@ContextConfiguration(locations
= { "classpath:applicationContext.xml",
"file:src/main/webapp/WEB-INF/dispatcherServlet-servlet.xml" })
public class MvcTest {
@Autowired
WebApplicationContext context
;
MockMvc mockMvc
;
@Before
public void initMokcMvc() {
mockMvc
= MockMvcBuilders
.webAppContextSetup(context
).build();
}
@Test
public void testPage() throws Exception
{
MvcResult result
= mockMvc
.perform(MockMvcRequestBuilders
.get("/emps").param("pn", "1"))
.andReturn();
MockHttpServletRequest request
= result
.getRequest();
PageInfo pi
= (PageInfo
) request
.getAttribute("pageInfo");
System
.out
.println("当前页码:"+pi
.getPageNum());
System
.out
.println("总页码:"+pi
.getPages());
System
.out
.println("总记录数:"+pi
.getTotal());
System
.out
.println("在页面需要连续显示的页码");
int[] nums
= pi
.getNavigatepageNums();
for (int i
: nums
) {
System
.out
.print(" "+i
);
}
List
<Employee> list
= pi
.getList();
for (Employee employee
: list
) {
System
.out
.println("ID:"+employee
.getEmpId()+"==>Name:"+employee
.getEmpName());
}
}
}