1. 程式人生 > >spring中用MockMvc做單元測試

spring中用MockMvc做單元測試

轉自  http://blog.csdn.net/pengoneeast/article/details/46890581

一般測試驅動開發專案中,我們會在Maven中建立一個專案檔案和一個一一對應的測試專案檔案。每寫好一個模組,先對其進行單元測試,再整合到現有的系統中。

針對Controller、Service、Dao三層架構來說,我們最常對Service和Dao進行單元測試。然而Controller的測試,很多人還是啟動Tomcat,進行介面測試,這樣不緊需要等待很長的編譯部署時間而且無法逐個Controller功能進行單獨測試,因此特意總結Controller層的單元測試。

技術選型:SpringMVC框架 。SpringMVC已經繼承了單元測試的類

1.建立普通類檔案

2.引入spring單元測試註釋

  1. @RunWith(SpringJUnit4ClassRunner.class)  //此處呼叫Spring單元測試類
  2. @WebAppConfiguration//呼叫javaWEB的元件,比如自動注入ServletContext Bean等等
  3. @ContextConfiguration(locations = {"classpath:spring-context.xml","classpath:spring-mvc.xml"})//載入Spring配置檔案
  4. publicclass HealthArticleControllerTest {...程式碼片段 }
    //測試程式碼類
注意:

@WebAppConfiguration如果不加的話,是沒法呼叫WEB的一些特性的。經常會被遺忘掉。。。

@ContextConfiguration中,需要把所有Spring的配置檔案全部載入進來,因為有的專案中Spring 的xml配置是分拆的。 此處的xml是放在resources的根目錄中。

3.引入spring註解後,Controller的單元測試需要模擬Server的執行,需要在class中進行WEB環境的初始化。

  1. @Autowired
  2. HealthArticleController healthArticleController;  
  3. @Autowired
  4. ServletContext context;  
  5. MockMvc mockMvc;  
  6. @Before
  7. publicvoid setup(){  
  8.     mockMvc = MockMvcBuilders.standaloneSetup(healthArticleController).build();  
  9. }  
HealthArticleController是我需要測試的Controller

MockMvc是SpringMVC提供的Controller測試類

每次進行單元測試時,都是預先執行@Before中的setup方法,初始化healthArticleController單元測試環境。

注意:一定要把待測試的Controller例項進行MockMvcBuilders.standaloneSetup(xxxxController).build(); 否則會丟擲無法找到@RequestMapping路徑的異常:No mapping found for HTTP request with URI [/cms/app/getArticleList] in DispatcherServlet

4.前期準備工作都做好了。可以編寫單元測試方法了。

  1. <span style="font-family: Arial, Helvetica, sans-serif;">  
  2. </span>  
  1. <span style="font-family: Arial, Helvetica, sans-serif;">@org.junit.Test  
  2.     publicvoid getArticleListTest(){  
  3. </span>  
  1. <span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">     </span>String postJson = healthArticleController.findPage();</span>  
  1. <span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">     </span>//傳送請求</span>
  1. ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/cms/app/getArticleList").accept(MediaType.APPLICATION_JSON).param("criJson",postJson));  
  2. MvcResult mvcResult = resultActions.andReturn();  
  3. String result = mvcResult.getResponse().getContentAsString();  
  4. System.out.println("=====客戶端獲得反饋資料:" + result);  

ResultAction是用來模擬Browser傳送FORM表單請求的。post()是請求的地址,accept()請求的內容 param()請求的鍵值對,如果有多個引數可以後綴呼叫多個param()

MvcResult是獲得伺服器的Response內容。

5.到此,整個完整的Controller單元測試完成。貼上我完整的程式碼

  1. package com.chinare.health.modules.cms;  
  2. import org.junit.Before;  
  3. import org.junit.runner.RunWith;  
  4. import org.springframework.beans.factory.annotation.Autowired;  
  5. import org.springframework.http.MediaType;  
  6. import org.springframework.test.context.ContextConfiguration;  
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  8. import org.springframework.test.context.web.WebAppConfiguration;  
  9. import org.springframework.test.web.servlet.MockMvc;  
  10. import org.springframework.test.web.servlet.MvcResult;  
  11. import org.springframework.test.web.servlet.ResultActions;  
  12. import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;  
  13. import org.springframework.test.web.servlet.setup.MockMvcBuilders;  
  14. import javax.servlet.ServletContext;  
  15. import java.util.Map;  
  16. /** 
  17.  * author: Samuel 
  18.  * Date:2015-07-04 
  19.  */
  20. @RunWith(SpringJUnit4ClassRunner.class)  
  21. @WebAppConfiguration
  22. @ContextConfiguration(locations = {"classpath:spring-context.xml""classpath:spring-context-jedis.xml""classpath:spring-mvc.xml""classpath:spring-context-shiro.xml""classpath:spring-context-activiti.xml"})  
  23. publicclass HealthArticleControllerTest {  
  24.     @Autowired
  25.     HealthArticleController healthArticleController;  
  26.     @Autowired
  27.     ServletContext context;  
  28.     MockMvc mockMvc;  
  29.     @Before
  30.     publicvoid setup(){  
  31.         mockMvc = MockMvcBuilders.standaloneSetup(context).build();  
  32.     }  
  33.     @org.junit.Test  
  34.     publicvoid getArticleListTest() throws Exception{  
  35.         //準備引數
  36.         String <span style="font-family: Arial, Helvetica, sans-serif;">postJson </span>= "{\"mac\":\"h\",\"dtClient\":\"2015-06-03 13:20:10\"}";  
  37.         //傳送請求
  38.         ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/cms/app/getArticleList")  
  39.                 .accept(MediaType.APPLICATION_JSON).param("criJson",postJson));  
  40.         MvcResult mvcResult = resultActions.andReturn();  
  41.         String result = mvcResult.getResponse().getContentAsString();  
  42.         System.out.println("=====客戶端獲得反饋資料:" + result);  
  43.     }  
  44. }  

遇到的異常 

http://blog.csdn.net/a35038438/article/details/50216673

http://blog.csdn.net/bian1729183741/article/details/47420031

http://www.cnblogs.com/ningheshutong/p/6478080.html