Spring+SpringMVC+MyBatis+easyUI整合優化篇(五)結合MockMvc進行服務端的單元測試

<h1>日常啰嗦</h1>

承接前一篇文章《Spring+SpringMVC+MyBatis+easyUI整合優化篇(四)單元測試實例》,已經講解了dao層和service層的單元測試,還有控制器這層也不能漏掉,因此本篇會講一下MockMvc,及controller控制層的單元測試,相關代碼已上傳,可自行下載。
我的github地址

<h1>為什么使用MockMvc?</h1>

可能我們在測試控制層的代碼都是啟動服務器,在瀏覽器中輸入URL,然后開始測試是否達到預期效果,發生錯誤的話,修改相關代碼并重啟服務器再次進行測試。分析一下這個過程,啟動服務器-->打開瀏覽器-->輸入URL-->等待返回結果-->修復bug-->重啟服務器.....循環。
其中的缺點也挺明顯的,在瀏覽器輸入URL的地址,如果是GET請求還好,POST請求或者DELETE請求怎么辦?只能借助其他工具,通過命令行編寫curl語句,或者借助谷歌瀏覽器的postman插件,亦或者自己在代碼中通過編寫相應httpClient方法來實現測試,但是這幾種方法都較為麻煩,而且測試用例并不能較好的保存。再說一個缺點,代碼修改后,往往需要再次重啟服務器,等待啟動完畢才能接下來的測試過程。
如果tomcat服務器啟動速度較慢,這將是一件非常痛苦的事情,測試驗證也不方便,且依賴網絡環境,這些原因導致測試起來很麻煩,而為了可以方便對Controller進行測試,且很好的保存和循環使用測試用例,則可以通過單元測試來解決,通過前面一篇文章,大家對于單元測試的便利性有了認識和體會,接下來通過引入MockMVC進行控制層的單元測試。
MockMvc實現了對Http請求的模擬,能夠直接使用網絡的形式,轉換到Controller的調用,這樣可以使得測試速度快、不依賴網絡環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便。

<h1>MockMvc單元測試實例</h1>

MockMvc測試過程:
1、創建請求
2、設置參數(這一步其實可以設置很多參數,MockMvc提供了豐富的方法,但是本例中只是簡單的參數設置,因為方法都較簡單,并沒有復雜的調用)
3、mockMvc調用perform,調用controller的業務處理邏輯
4、perform返回ResultActions,返回操作結果,通過ResultActions,提供了統一的驗證方式。

測試代碼在test包中,也已經傳到github上,可以下載到本地運行測試。

@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 即為后端成功相應
    //返回數據
    }
    
}  

<h1>總結</h1>
如果你還是習慣于啟動tomcat服務器,然后在瀏覽器中輸入地址測試的話,也未嘗不可,方法在上面,已經寫好了,使不使用還是要看個人習慣的。
以上的測試都是針對本項目的簡單測試,應該都不是很復雜,很容易上手的,后面如果有復雜的測試的話,再進行深入的講解,想要深入了解SpringMVC的MockMvc測試的話可以自行搜索相關教程。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,981評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,251評論 4 61
  • 望著黑云一步步逼近 我不想再逃了 你看,那稻草人始終微笑著 我抬起頭仰望,沉默,微笑 攤開臂膀 暴風雨,來吧 ……...
    封城雪閱讀 240評論 0 0
  • 昨天國民女神張敏一條微博引起了軒然大波,大致意思就是:張慧敏,我很珍惜我們倆的共度時光,我想你,我愿共同幸福。這一...
    源音塘閱讀 472評論 0 0