在Spring 3.2之前,测试时一般都是直接new控制器,注入依赖,然后判断返回值。但是我们无法连同Spring MVC的基础设施(如DispatcherServlet调度、类型转换、数据绑定、拦截器等)一起测试,另外也没有现成的方法测试如最终渲染的视图(@ResponseBody生成的JSON/XML、JSP、Velocity等)内容是否正确。从Spring 3.2开始这些事情都可以完成了。而且可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试。
添加Maven依赖
|
|
版本信息:
测试相关的依赖(junit
、hamcrest
、mockito
、spring-test
)
|
|
版本信息:
Spring MVC测试说明
首先是Spring的几个Annotate
- RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;
- WebAppConfiguration: 测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的;value指定web应用的根;
- ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;
然后是Mockito的Annotate
- Mock: 如果该对象需要mock,则加上此Annotate;
- InjectMocks: 使mock对象的使用类可以注入mock对象,在上面这个例子中,mock对象是UserService,使用了UserService的是UserController,所以在Controller加上该Annotate;
Setup方法
MockitoAnnotations.initMocks(this)
: 将打上Mockito标签的对象起作用,使得Mock的类被Mock,使用了Mock对象的类自动与Mock对象关联。mockMvc
: 这个对象是Controller单元测试的关键,它的初始化也是在setup方法里面。
Test Case
- 首先mock了UserService的方法,让其返回一个成功的Result对象。
mockMvc.perform
: 发起一个http请求。post(url)
: 表示一个post请求,url对应的是Controller中被测方法的Rest url。param(key, value)
: 表示一个request parameter,方法参数是key和value。andDo(print())
: 表示打印出request和response的详细信息,便于调试。andExpect(status().isOk())
: 表示期望返回的Response Status是200。andExpect(content().string(is(expectstring))
: 表示期望返回的Response Body内容是期望的字符串。
spring mvc测试框架提供了两种方式,独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。