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); } }; }


相關文章
相關標籤/搜索