使用MockMvc做spring單元測試剖析

問題描述

  • 需要為某個controller寫一個單元測試,使用MockMvc進行測試
  • 還是使用@Autowired注入一個MockMvc的對象,使用@MockBean給service注入一個Mock對象
  • @RunWith(SpringRunner.class)運行測試
  • 但是測試一運行就會報錯,爆出can not create
    ComputeControllerTest bean
  • 還記得之前springBoot的單元測試我就采用了這樣的方式測試也沒有出錯
@RunWith(SpringRunner.class)
public class ComputeControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private ComputeService computeService;

    @Test
    public void should_return_sum_answer() throws Exception {
        .....
    }
}

問題分析

  • Q1:認真分析錯誤log中Caused by:No qualifying bean of type 'org.springframework.test.web.servlet.MockMvc' available
  • A1:說明沒有辦法為ComputeControllerTest創(chuàng)建一個Bean原因:ComputeControllerTest的bean依賴于MockMvc和ComputeService的bean都創(chuàng)建成功,而且錯誤說是MockMvc無法創(chuàng)建Bean

  • Q2:為什么MockMvc沒有辦法創(chuàng)建bean?
  • A2:首先MockMvc不是由我們自己創(chuàng)建的,沒有辦法采用@Bean的方式強制其創(chuàng)建,所以必然是spring的ApplicationContext沒有加載全,那么一般spring會通過注解自動將所需的上下文引入

  • Q3:那么使用什么樣的注解能夠?qū)в蠱ockMvc Bean的上下文加載進來呢?
  • 那么此時分析原因后就應該去官網(wǎng)找demo看看人家是什么寫的

  • Q4:發(fā)現(xiàn)自己在test類之前少了@WebMvcTest()注解,因此我飛快的填上寫成如下形式,仍然爆出 一樣的錯誤,為什么官網(wǎng)這樣寫就能run?
@RunWith(SpringRunner.class)
@WebMvcTest(Application.class)
public class ComputeControllerTest {
.....
}
  • A4:認真和demo比對后,我發(fā)現(xiàn)了自己寫錯了@WebMvcTest()的參數(shù),將參數(shù)改成ComputeController.class就沒有爆出同樣的錯誤了

  • Q5.卻發(fā)現(xiàn)測試還是掛著的,我在測試中使用了assertJ的mock,given(computeService.compute(1,2)).willReturn(3);發(fā)現(xiàn)報錯說given的參數(shù)不是一個Mock對象,明明我是通過@MockBean的注解注入的值為什么不是Mock對象?
  • A5:還記得以前提起過,集成測試沒有辦法Mock是因為所有的服務都被啟動了,真正需要向服務器發(fā)請求,所以服務內(nèi)部我們就不可控,更沒有辦法將服務內(nèi)的某個東西使用Mock對象代替。因此由這樣遷移就可以發(fā)現(xiàn)必然是service還是并沒有被mock對象頂替,到了service中發(fā)現(xiàn)Service中的compute竟然成了靜態(tài)方法,修改之后,測試通過

解答思考

  • @WebMvcTest(Application.class)注解有什么作用,參數(shù)又代表了什么?
  1. @WebMvcTest(Application.class):自動加載spring Mvc的配置、MockMvc的配置,掃描注解類,其實簡單的說就是,這個注解提供了MockMvc的Bean所需要的Bean
  2. @WebMvcTest(Application.class)參數(shù)的作用:通常是MockMvc做單元測試,并且他只會啟動部分的服務,而不是整個服務器。這句話我一直不能理解,直到了解了這個參數(shù),參數(shù)是一個你需要測試的Controller類,也就是說,這個注解只會啟動參數(shù)controller的那一部分服務,也就是所謂部分的服務,因此我之前填寫的整個Application.class就不會起作用。
  • 為什么靜態(tài)方法沒有辦法被Mock?
  1. 我猜想,因為靜態(tài)方法不需要實例也就是說調(diào)用這個方法的不要求對應類有個實例,換句話說,不需要對應類的Bean就可以直接使用這個方法。然而當你Mock掉一個類的時候,就是通過使用Mock的bean替換真實的bean。然而靜態(tài)方法不需要bean,所以這個方法自然跟mock對象沒有任何關(guān)系。就更不可能控制它的返回值

想說的話

  1. 現(xiàn)在看英文文檔已經(jīng)沒有那么拒絕了,但是還是有個很大的問題就是漏掉重點?。。∵@個該怎么辦······哎先多看看吧
  2. 發(fā)現(xiàn)自己想當然的本事很厲害,以前那些注解能用絕對不查,總是自以為他是這個作用,必然導致下次不會用,再出bug,這個問題我很矛盾,雖然我應該查清楚我不會的部分到底是什么作用,可又會花費我很多時間。。這又該怎么辦
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,889評論 6 342
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,185評論 2 7
  • 篇章 ELON’S FIRST START-UP Elon 和弟弟 Kimbal一起建立的第一家公司 Zig 2,...
    谷音sp閱讀 577評論 0 0
  • “臨近母親節(jié),讓我們親手為媽媽做一份禮物吧!” 楊老師舉起一塊長條形的櫻桃木,向小朋友們展示木頭的紋理,然后教大家...
    qingshe閱讀 414評論 0 1