Spring+SpringMVC+MyBatis+easyUI整合優(yōu)化篇(五)結(jié)合MockMvc進(jìn)行服務(wù)端的單元測(cè)試

<h1>日常啰嗦</h1>

承接前一篇文章《Spring+SpringMVC+MyBatis+easyUI整合優(yōu)化篇(四)單元測(cè)試實(shí)例》,已經(jīng)講解了dao層和service層的單元測(cè)試辽话,還有控制器這層也不能漏掉,因此本篇會(huì)講一下MockMvc冰更,及controller控制層的單元測(cè)試尚辑,相關(guān)代碼已上傳,可自行下載呻粹。
我的github地址

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

可能我們?cè)跍y(cè)試控制層的代碼都是啟動(dòng)服務(wù)器苏研,在瀏覽器中輸入U(xiǎn)RL等浊,然后開始測(cè)試是否達(dá)到預(yù)期效果,發(fā)生錯(cuò)誤的話摹蘑,修改相關(guān)代碼并重啟服務(wù)器再次進(jìn)行測(cè)試筹燕。分析一下這個(gè)過程,啟動(dòng)服務(wù)器-->打開瀏覽器-->輸入U(xiǎn)RL-->等待返回結(jié)果-->修復(fù)bug-->重啟服務(wù)器.....循環(huán)。
其中的缺點(diǎn)也挺明顯的撒踪,在瀏覽器輸入U(xiǎn)RL的地址过咬,如果是GET請(qǐng)求還好,POST請(qǐng)求或者DELETE請(qǐng)求怎么辦制妄?只能借助其他工具掸绞,通過命令行編寫curl語(yǔ)句,或者借助谷歌瀏覽器的postman插件忍捡,亦或者自己在代碼中通過編寫相應(yīng)httpClient方法來實(shí)現(xiàn)測(cè)試集漾,但是這幾種方法都較為麻煩切黔,而且測(cè)試用例并不能較好的保存砸脊。再說一個(gè)缺點(diǎn),代碼修改后纬霞,往往需要再次重啟服務(wù)器凌埂,等待啟動(dòng)完畢才能接下來的測(cè)試過程。
如果tomcat服務(wù)器啟動(dòng)速度較慢诗芜,這將是一件非常痛苦的事情瞳抓,測(cè)試驗(yàn)證也不方便,且依賴網(wǎng)絡(luò)環(huán)境伏恐,這些原因?qū)е聹y(cè)試起來很麻煩孩哑,而為了可以方便對(duì)Controller進(jìn)行測(cè)試,且很好的保存和循環(huán)使用測(cè)試用例翠桦,則可以通過單元測(cè)試來解決横蜒,通過前面一篇文章,大家對(duì)于單元測(cè)試的便利性有了認(rèn)識(shí)和體會(huì)销凑,接下來通過引入MockMVC進(jìn)行控制層的單元測(cè)試丛晌。
MockMvc實(shí)現(xiàn)了對(duì)Http請(qǐng)求的模擬,能夠直接使用網(wǎng)絡(luò)的形式斗幼,轉(zhuǎn)換到Controller的調(diào)用澎蛛,這樣可以使得測(cè)試速度快、不依賴網(wǎng)絡(luò)環(huán)境蜕窿,而且提供了一套驗(yàn)證的工具谋逻,這樣可以使得請(qǐng)求的驗(yàn)證統(tǒng)一而且很方便。

<h1>MockMvc單元測(cè)試實(shí)例</h1>

MockMvc測(cè)試過程:
1桐经、創(chuàng)建請(qǐng)求
2斤贰、設(shè)置參數(shù)(這一步其實(shí)可以設(shè)置很多參數(shù),MockMvc提供了豐富的方法次询,但是本例中只是簡(jiǎn)單的參數(shù)設(shè)置荧恍,因?yàn)榉椒ǘ驾^簡(jiǎn)單,并沒有復(fù)雜的調(diào)用)
3、mockMvc調(diào)用perform送巡,調(diào)用controller的業(yè)務(wù)處理邏輯
4摹菠、perform返回ResultActions,返回操作結(jié)果骗爆,通過ResultActions次氨,提供了統(tǒng)一的驗(yàn)證方式。

測(cè)試代碼在test包中摘投,也已經(jīng)傳到github上煮寡,可以下載到本地運(yùn)行測(cè)試。

@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 {
        //創(chuàng)建書籍列表的請(qǐng)求
        //請(qǐng)求方式為get
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.get("/book/listAll.do");
        //此請(qǐng)求并不需要添加請(qǐng)求參數(shù) 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 {
        //創(chuàng)建書架創(chuàng)建的請(qǐng)求
        //請(qǐng)求方式為post
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post("/store/save.do");
        //添加編號(hào)為MockMvc的書架
        mockHttpServletRequestBuilder.param("number", "MockMvc");
        //書架為兩層
        mockHttpServletRequestBuilder.param("level", "2");
        mockMvc.perform(mockHttpServletRequestBuilder).andExpect(status().isOk())
                .andDo(print());
    }

    @Test
    public void testList() throws Exception {
        //創(chuàng)建書架創(chuàng)建的請(qǐng)求
        //請(qǐng)求方式為post
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders.post("/store/list.do");
        //有些參數(shù)我注釋掉了犀呼,你可以自行添加相關(guān)參數(shù)幸撕,得到不同的測(cè)試結(jié)果
        //status為0的記錄
        //mockHttpServletRequestBuilder.param("status", "0");
        //書架編號(hào)為dd的記錄
        //mockHttpServletRequestBuilder.param("number", "dd");
        //第一頁(yè)
        mockHttpServletRequestBuilder.param("page", "1");
        //每頁(yè)10條記錄
        mockHttpServletRequestBuilder.param("rows", "10");
        mockMvc.perform(mockHttpServletRequestBuilder).andExpect(status().isOk())
                .andDo(print());
                
    //控制臺(tái)會(huì)打印如下結(jié)果:
    //MockHttpServletResponse:
    //Status = 200 即為后端成功相應(yīng)
    //返回?cái)?shù)據(jù)
    }
    
}  

<h1>總結(jié)</h1>
如果你還是習(xí)慣于啟動(dòng)tomcat服務(wù)器,然后在瀏覽器中輸入地址測(cè)試的話外臂,也未嘗不可坐儿,方法在上面,已經(jīng)寫好了宋光,使不使用還是要看個(gè)人習(xí)慣的貌矿。
以上的測(cè)試都是針對(duì)本項(xiàng)目的簡(jiǎn)單測(cè)試,應(yīng)該都不是很復(fù)雜罪佳,很容易上手的逛漫,后面如果有復(fù)雜的測(cè)試的話,再進(jìn)行深入的講解赘艳,想要深入了解SpringMVC的MockMvc測(cè)試的話可以自行搜索相關(guān)教程酌毡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市第练,隨后出現(xiàn)的幾起案子阔馋,更是在濱河造成了極大的恐慌,老刑警劉巖娇掏,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呕寝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡婴梧,警方通過查閱死者的電腦和手機(jī)下梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塞蹭,“玉大人孽江,你說我怎么就攤上這事》纾” “怎么了岗屏?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵辆琅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我这刷,道長(zhǎng)婉烟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任暇屋,我火速辦了婚禮似袁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咐刨。我一直安慰自己昙衅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布定鸟。 她就那樣靜靜地躺著而涉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仔粥。 梳的紋絲不亂的頭發(fā)上婴谱,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天蟹但,我揣著相機(jī)與錄音躯泰,去河邊找鬼。 笑死华糖,一個(gè)胖子當(dāng)著我的面吹牛麦向,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播客叉,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼诵竭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了兼搏?” 一聲冷哼從身側(cè)響起卵慰,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佛呻,沒想到半個(gè)月后裳朋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吓著,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年鲤嫡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绑莺。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暖眼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纺裁,到底是詐尸還是另有隱情诫肠,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站栋豫,受9級(jí)特大地震影響惭缰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笼才,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一漱受、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骡送,春花似錦昂羡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至派敷,卻和暖如春蛹批,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篮愉。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工腐芍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人试躏。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓猪勇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親颠蕴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泣刹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)犀被,斷路器椅您,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件寡键、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • 望著黑云一步步逼近 我不想再逃了 你看掀泳,那稻草人始終微笑著 我抬起頭仰望,沉默昌腰,微笑 攤開臂膀 暴風(fēng)雨开伏,來吧 ……...
    封城雪閱讀 229評(píng)論 0 0
  • 昨天國(guó)民女神張敏一條微博引起了軒然大波劫流,大致意思就是:張慧敏巫玻,我很珍惜我們倆的共度時(shí)光丛忆,我想你,我愿共同幸福仍秤。這一...
    源音塘閱讀 417評(píng)論 0 0