导入需要的包
在pom.xml中添加
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>hamcrest-core</artifactId>
<groupId>org.hamcrest</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.core.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>hamcrest-core</artifactId>
<groupId>org.hamcrest</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!-包版本参数-!>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.0.0.RELEASE</spring.version>
<junit.version>4.11</junit.version>
<hamcrest.version>1.3</hamcrest.version>
<mockito.core.version>1.9.5</mockito.core.version>
</properties>
对于JSON请求和响应验证需要安装jackson Json和JsonPath依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson2.version}</version>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>${jsonpath.version}</version>
<scope>test</scope>
</dependency>
<properties>
<jsonpath.version>0.9.0</jsonpath.version>
<jackson2.version>2.2.3</jackson2.version>
</properties>
Spring mvc测试框架提供了测试MVC需要的API,主要包括有Servlet/JSP Mock,MockMvcBuilder,MockMvcRequestBuilder,ResultMatcher,ResultHandler,MvcResult。
可以静态导入方便测试:
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.*;
测试步骤如下:
- 准备测试环境
- 通过MockMvc执行请求
- 验证步骤
3.1. 添加验证断言
3.2. 添加结果处理器
3.3. 得到MvcResult进行自定义断言/进行下一步的异步请求 - 卸载测试环境
以下是一个测试的完整步骤。
//只显示了静态导入的部分
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.*;
//配置环境
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration(value = "spring-mvc-test/src/main/webapp")
@ContextHierarchy({
@ContextConfiguration(locations = "classpath:spring-config.xml"),
@ContextConfiguration(locations = "classpath:spring-mvc.xml")
})
public class ServerControllerTest {
@Autowired
private WebApplicationContext wac;
@Mock
private MockMvc mockMvc;
@Before
public void setUp() {
//设置mock对象
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
@Test
public void test1() throws Exception {
//测试普通控制器
mockMvc.perform(get("/user/{id}", 1)) //执行请求
.andExpect(model().attributeExists("user")) //验证存储模型数据
.andExpect(model().attribute("user", hasProperty("name", equalTo("zhang")))) //验证存储模型数据
.andExpect(view().name("user/view")) //验证viewName
.andExpect(forwardedUrl("/WEB-INF/jsp/user/view.jsp"))//验证视图渲染时forward到的jsp
.andExpect(status().isOk())//验证状态码
.andDo(print()); //输出MvcResult到控制台
}
}
1.构建MockMvc对象
MockMvc对象由MockMvcBuilder来构造,有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
我们可以通过静态工厂MockMvcBuilders来创建。
对于传入了webApplicationContext的DefaultMockMvcBuilder提供了以下的API:
standaloneSetup(Object…)返回的StandaloneMockMvcBuilder由于不涉及到webApplicationContext,只是对Controller类的测试,所以还可以对其添加拦截器,映射器,验证器等。
2.执行请求
获得MockMvc对象后,通过mockMvc.perform方法来执行请求。
请求有以下几类,都是MockMvcRequestBuilders中的静态方法:
常用的有get,post,fileUpload。
返回的是MockMvcRequestBuilder对象,有设置param,cookie,header,accept等的方法
perform方法返回ResultActions对象
3.进行验证
mockMvc.perform返回的是 org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder对象,可以链式调用:
andExpect:添加ResultMatcher验证规则
andDo:添加ResultHandler结果处理器
andReturn:返回org.springframework.test.web.servlet.MvcResult对象,可以对其进行进一步的测试。
MvcResult有以下方法:
在andExpect中,需要传入ResultMatcher,通常由MockResultMatchers类来调用静态方法获取不同的测试分类静态工厂类。
比如执行.view()后返回ViewResultsMatchers静态工厂类,这个类主要有两个方法,
,然后由静态工厂类来生成ResultMatcher对象。
ResultMatcher只有一个接口,类似于函数接口。
public ResultMatcher name(final Matcher<? super String> matcher) {
return new ResultMatcher() {
@Override
public void match(MvcResult result) throws Exception {
ModelAndView mav = result.getModelAndView();
assertTrue("No ModelAndView found", mav != null);
assertThat("View name", mav.getViewName(), matcher);
}
};
}