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單元測試註釋
- @RunWith(SpringJUnit4ClassRunner.class) //此處呼叫Spring單元測試類
- @WebAppConfiguration//呼叫javaWEB的元件,比如自動注入ServletContext Bean等等
- @ContextConfiguration(locations = {"classpath:spring-context.xml","classpath:spring-mvc.xml"})//載入Spring配置檔案
-
publicclass HealthArticleControllerTest {...程式碼片段 }
@WebAppConfiguration如果不加的話,是沒法呼叫WEB的一些特性的。經常會被遺忘掉。。。
@ContextConfiguration中,需要把所有Spring的配置檔案全部載入進來,因為有的專案中Spring 的xml配置是分拆的。 此處的xml是放在resources的根目錄中。
3.引入spring註解後,Controller的單元測試需要模擬Server的執行,需要在class中進行WEB環境的初始化。
- @Autowired
- HealthArticleController healthArticleController;
-
@Autowired
- ServletContext context;
- MockMvc mockMvc;
- @Before
- publicvoid setup(){
- mockMvc = MockMvcBuilders.standaloneSetup(healthArticleController).build();
- }
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.前期準備工作都做好了。可以編寫單元測試方法了。
- <span style="font-family: Arial, Helvetica, sans-serif;">
- </span>
- <span style="font-family: Arial, Helvetica, sans-serif;">@org.junit.Test
- publicvoid getArticleListTest(){
- </span>
- <span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>String postJson = healthArticleController.findPage();</span>
- <span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>//傳送請求</span>
- ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/cms/app/getArticleList").accept(MediaType.APPLICATION_JSON).param("criJson",postJson));
- MvcResult mvcResult = resultActions.andReturn();
- String result = mvcResult.getResponse().getContentAsString();
- System.out.println("=====客戶端獲得反饋資料:" + result);
ResultAction是用來模擬Browser傳送FORM表單請求的。post()是請求的地址,accept()請求的內容 param()請求的鍵值對,如果有多個引數可以後綴呼叫多個param()
MvcResult是獲得伺服器的Response內容。
5.到此,整個完整的Controller單元測試完成。貼上我完整的程式碼
- package com.chinare.health.modules.cms;
- import org.junit.Before;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.http.MediaType;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import org.springframework.test.context.web.WebAppConfiguration;
- import org.springframework.test.web.servlet.MockMvc;
- import org.springframework.test.web.servlet.MvcResult;
- import org.springframework.test.web.servlet.ResultActions;
- import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
- import org.springframework.test.web.servlet.setup.MockMvcBuilders;
- import javax.servlet.ServletContext;
- import java.util.Map;
- /**
- * author: Samuel
- * Date:2015-07-04
- */
- @RunWith(SpringJUnit4ClassRunner.class)
- @WebAppConfiguration
- @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"})
- publicclass HealthArticleControllerTest {
- @Autowired
- HealthArticleController healthArticleController;
- @Autowired
- ServletContext context;
- MockMvc mockMvc;
- @Before
- publicvoid setup(){
- mockMvc = MockMvcBuilders.standaloneSetup(context).build();
- }
- @org.junit.Test
- publicvoid getArticleListTest() throws Exception{
- //準備引數
- String <span style="font-family: Arial, Helvetica, sans-serif;">postJson </span>= "{\"mac\":\"h\",\"dtClient\":\"2015-06-03 13:20:10\"}";
- //傳送請求
- ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/cms/app/getArticleList")
- .accept(MediaType.APPLICATION_JSON).param("criJson",postJson));
- MvcResult mvcResult = resultActions.andReturn();
- String result = mvcResult.getResponse().getContentAsString();
- System.out.println("=====客戶端獲得反饋資料:" + result);
- }
- }
遇到的異常
http://blog.csdn.net/a35038438/article/details/50216673
http://blog.csdn.net/bian1729183741/article/details/47420031
http://www.cnblogs.com/ningheshutong/p/6478080.html