Mock单元测试

导入须要的包
在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

  1. 准备测试环境
  2. 经过MockMvc执行请求
  3. 验证步骤
    3.1. 添加验证断言
    3.2. 添加结果处理器
    3.3. 获得MvcResult进行自定义断言/进行下一步的异步请求
  4. 卸载测试环境
    如下是一个测试的完整步骤。
 
 
 
 
//只显示了静态导入的部分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来建立。
spring-mvc

对于传入了webApplicationContext的DefaultMockMvcBuilder提供了如下的API:
cookie

standaloneSetup(Object…)返回的StandaloneMockMvcBuilder因为不涉及到webApplicationContext,只是对Controller类的测试,因此还能够对其添加拦截器,映射器,验证器等。
mvc

2.执行请求

得到MockMvc对象后,经过mockMvc.perform方法来执行请求。
请求有如下几类,都是MockMvcRequestBuilders中的静态方法:

经常使用的有get,post,fileUpload。
返回的是MockMvcRequestBuilder对象,有设置param,cookie,header,accept等的方法

perform方法返回ResultActions对象app

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类来调用静态方法获取不一样的测试分类静态工厂类。
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); } }; }


相关文章
相关标签/搜索