承接前一篇文章《Spring+SpringMVC+MyBatis+easyUI整合優化篇(四)單元測試實例》,已經講解了dao層和service層的單元測試,還有控制器這層也不能漏掉,所以本篇會講一下MockMvc,及controller控制層的單元測試,相關代碼已上傳,可自行下載。
個人github地址html
可能咱們在測試控制層的代碼都是啓動服務器,在瀏覽器中輸入URL,而後開始測試是否達到預期效果,發生錯誤的話,修改相關代碼並重啓服務器再次進行測試。分析一下這個過程,啓動服務器-->打開瀏覽器-->輸入URL-->等待返回結果-->修復bug-->重啓服務器.....循環。
其中的缺點也挺明顯的,在瀏覽器輸入URL的地址,若是是GET請求還好,POST請求或者DELETE請求怎麼辦?只能藉助其餘工具,經過命令行編寫curl語句,或者藉助谷歌瀏覽器的postman插件,亦或者本身在代碼中經過編寫相應httpClient方法來實現測試,可是這幾種方法都較爲麻煩,並且測試用例並不能較好的保存。再說一個缺點,代碼修改後,每每須要再次重啓服務器,等待啓動完畢才能接下來的測試過程。
若是tomcat服務器啓動速度較慢,這將是一件很是痛苦的事情,測試驗證也不方便,且依賴網絡環境,這些緣由致使測試起來很麻煩,而爲了能夠方便對Controller進行測試,且很好的保存和循環使用測試用例,則能夠經過單元測試來解決,經過前面一篇文章,你們對於單元測試的便利性有了認識和體會,接下來經過引入MockMVC進行控制層的單元測試。
MockMvc實現了對Http請求的模擬,可以直接使用網絡的形式,轉換到Controller的調用,這樣可使得測試速度快、不依賴網絡環境,並且提供了一套驗證的工具,這樣可使得請求的驗證統一併且很方便。git
MockMvc測試過程:
一、建立請求
二、設置參數(這一步其實能夠設置不少參數,MockMvc提供了豐富的方法,可是本例中只是簡單的參數設置,由於方法都較簡單,並無複雜的調用)
三、mockMvc調用perform,調用controller的業務處理邏輯
四、perform返回ResultActions,返回操做結果,經過ResultActions,提供了統一的驗證方式。github
測試代碼在test包中,也已經傳到github上,能夠下載到本地運行測試。web
@RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration({"classpath*:/applicationContext.xml", "classpath*:/spring-mvc.xml", "classpath*:/mybatis-config.xml"}) public class BookControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setup() { this.mockMvc = webAppContextSetup(this.wac).build(); } @Test public void testList() throws Exception { //建立書籍列表的請求 //請求方式爲get MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.get("/book/listAll.do"); //此請求並不須要添加請求參數 mockMvc.perform(mockHttpServletRequestBuilder).andExpect(status().isOk()) .andDo(print()); } }
@RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration({"classpath*:/applicationContext.xml", "classpath*:/spring-mvc.xml", "classpath*:/mybatis-config.xml"}) @TransactionConfiguration(defaultRollback = false) @Transactional public class StoreControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setup() { this.mockMvc = webAppContextSetup(this.wac).build(); } @Test public void testSave() throws Exception { //建立書架建立的請求 //請求方式爲post MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post("/store/save.do"); //添加編號爲MockMvc的書架 mockHttpServletRequestBuilder.param("number", "MockMvc"); //書架爲兩層 mockHttpServletRequestBuilder.param("level", "2"); mockMvc.perform(mockHttpServletRequestBuilder).andExpect(status().isOk()) .andDo(print()); } @Test public void testList() throws Exception { //建立書架建立的請求 //請求方式爲post MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post("/store/list.do"); //有些參數我註釋掉了,你能夠自行添加相關參數,獲得不一樣的測試結果 //status爲0的記錄 //mockHttpServletRequestBuilder.param("status", "0"); //書架編號爲dd的記錄 //mockHttpServletRequestBuilder.param("number", "dd"); //第一頁 mockHttpServletRequestBuilder.param("page", "1"); //每頁10條記錄 mockHttpServletRequestBuilder.param("rows", "10"); mockMvc.perform(mockHttpServletRequestBuilder).andExpect(status().isOk()) .andDo(print()); //控制檯會打印以下結果: //MockHttpServletResponse: //Status = 200 即爲後端成功相應 //返回數據 } }
若是你仍是習慣於啓動tomcat服務器,而後在瀏覽器中輸入地址測試的話,也何嘗不可,方法在上面,已經寫好了,使不使用仍是要看我的習慣的。
以上的測試都是針對本項目的簡單測試,應該都不是很複雜,很容易上手的,後面若是有複雜的測試的話,再進行深刻的講解,想要深刻了解SpringMVC的MockMvc測試的話能夠自行搜索相關教程。spring