导入须要的包
在pom.xml中添加java
<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依赖:web
<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。
能够静态导入方便测试:spring
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.*;
测试步骤以下:json
//只显示了静态导入的部分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到控制台 }}
MockMvc对象由MockMvcBuilder来构造,有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
咱们能够经过静态工厂MockMvcBuilders来建立。
spring-mvc
对于传入了webApplicationContext的DefaultMockMvcBuilder提供了如下的API:
cookie
standaloneSetup(Object…)返回的StandaloneMockMvcBuilder因为不涉及到webApplicationContext,只是对Controller类的测试,因此还能够对其添加拦截器,映射器,验证器等。
mvc
得到MockMvc对象后,经过mockMvc.perform方法来执行请求。
请求有如下几类,都是MockMvcRequestBuilders中的静态方法:
经常使用的有get,post,fileUpload。
返回的是MockMvcRequestBuilder对象,有设置param,cookie,header,accept等的方法
perform方法返回ResultActions对象app
mockMvc.perform返回的是 org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder对象,能够链式调用:
andExpect:添加ResultMatcher验证规则
andDo:添加ResultHandler结果处理器
andReturn:返回org.springframework.test.web.servlet.MvcResult对象,能够对其进行进一步的测试。
MvcResult有如下方法:
框架
在andExpect中,须要传入ResultMatcher,一般由MockResultMatchers类来调用静态方法获取不一样的测试分类静态工厂类。
webapp
好比执行.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); } }; }