在SpringBoot中使用MockMvc進(jìn)行單元測試

本文來源:http://www.reibang.com/p/13408dd4bef7


主要思路是:使用MockMvc發(fā)起請求仔掸,然后執(zhí)行相應(yīng)的代碼拂苹,在執(zhí)行的過程中使用Mockito的mock模擬底層數(shù)據(jù)的返回鹃答,最后結(jié)果驗(yàn)證底靠。


Mockito框架官方地址mockito囚灼,文檔地址

MockMvc相關(guān)官方地址官方指南鳖眼,文檔地址


1黑毅、首先需要增加相應(yīng)的依賴:

/pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
</dependency>

需要在測試類中增加如下注解:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MockXXXTest {

}

注解的大概使用是(想知道詳細(xì)的可自行去網(wǎng)上找一下):
@RunWith(SpringRunner.class),就是指用SpringRunner來運(yùn)行钦讳,其中
SpringJUnit4ClassRunner 和 SpringRunner 區(qū)別是什么矿瘦?
在官方文檔中有如下這句話:

SpringRunner is an alias for the SpringJUnit4ClassRunner

@SpringBootTest是SpringBoot的一個(gè)用于測試的注解,通過SpringApplication在測試中創(chuàng)建ApplicationContext愿卒。

@AutoConfigureMockMvc是用于自動配置MockMvc


2缚去、接著需要使用@MockBean模擬相應(yīng)對象

這里的主要作用是:使用mock對象代替原來spring的bean,然后模擬底層數(shù)據(jù)的返回琼开,而不是調(diào)用原本真正的實(shí)現(xiàn)易结。

:與@MockBean 對應(yīng)的還有@SpyBean(有興趣可以去找一下相關(guān)的內(nèi)容)。 @SpyBean與 @Spy 的關(guān)系類似于 @MockBean 與 @Mock 的關(guān)系。和 @MockBean 不同的是搞动,它不會生成一個(gè) Bean 的替代品裝配到類中躏精,而是會監(jiān)聽一個(gè)真正的 Bean 中某些特定的方法,并在調(diào)用這些方法時(shí)給出指定的反饋鹦肿。

  • 首先增加 @MockBean 注解
public class MockXXXTest {
    @MockBean
    private XXXDao xxxtDao;

}

SpringBoot 中, @MockBean 會將mock的bean替換掉 SpringBoot 管理的原生bean矗烛,從而達(dá)到mock的效果。

mock:在軟件開發(fā)的世界之外, "mock"一詞是指模仿或者效仿. 因此可以將“mock”理解為一個(gè)替身箩溃,替代者. 在軟件開發(fā)中提及"mock"瞭吃,通常理解為模擬對象或者Fake

  • 然后 Stub 打樁
 Mockito.when(
        xxxDao.findMapBySql(
                Mockito.anyString(),Mockito.anyList()
        )
 ).thenReturn(dataList);

這里的when(…).thenReturn(…)表示的是:當(dāng)定義(when)對象、方法和參數(shù)(輸入)涣旨,然后(thenReturn) 中返回結(jié)果(輸出)歪架。默認(rèn)情況下,所有的函數(shù)都有返回值开泽。mock函數(shù)默認(rèn)返回的是null牡拇,一個(gè)空的集合或者一個(gè)被對象類型包裝的內(nèi)置類型,例如:0穆律、false對應(yīng)的對象類型為Integer、Boolean导俘。

這里值得注意的是:方法中使用的參數(shù)可以使用參數(shù)匹配器峦耘,如:Mockito.anyString(),Mockito.anyList()當(dāng)其中有一個(gè)參數(shù)使用了參數(shù)匹配器旅薄,其實(shí)的所有參數(shù)也需要使用參數(shù)匹配器辅髓,否則會出現(xiàn)異常。

3 使用MockMvc發(fā)送請求

這里的主要作用是:使用MockMvc發(fā)起一個(gè)請求少梁,然后進(jìn)行驗(yàn)證規(guī)則洛口、進(jìn)一步處理返回結(jié)果等。

//配置MockMvc
@Autowired
protected MockMvc mockMvc;
@Test
public void TestXXX() throws Exception {
       MvcResult result = mockMvc.perform(
                MockMvcRequestBuilders.get("/xxxController/xxx_query")
                        .contentType(MediaType.APPLICATION_JSON_UTF8)      
                        .param("xxx","xxx")

        )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();

    }
}

.perform() 執(zhí)行一個(gè)MockMvcRequestBuilders請求凯沪。其中.get()表示發(fā)送get請求(可以使用get第焰、post、put妨马、delete等)挺举;.contentType()設(shè)置編碼格式;.param()請求參數(shù),可以帶多個(gè)烘跺。
andExpect()添加 MockMvcResultMatchers驗(yàn)證規(guī)則湘纵,驗(yàn)證執(zhí)行結(jié)果是否正確。
.andDo()添加 MockMvcResultHandlers結(jié)果處理器,這是可以用于打印結(jié)果輸出滤淳。
.andReturn()結(jié)果還回梧喷,然后可以進(jìn)行下一步的處理。

完整例子如下:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MockXXXTest {
    @Autowired
    protected MockMvc mockMvc;
    @MockBean
    private XXXDao xxxtDao;
    @Test
    public void TestXXX() throws Exception {
        List<Map<String,Object>> dataList= new ArrayList<>();
        Map m=new HashMap();
        m.put("name","test");
        dataList.add(m);
        Mockito.when(xxxDao.findMapBySql(Mockito.anyString(),Mockito.anyList())).thenReturn(dataList);

        Mockito.when(xxxDao.findTotalCountBySql(Mockito.anyString(),Mockito.any())).thenReturn((long)1);

        MvcResult result = mockMvc.perform(
                MockMvcRequestBuilders.get("/xxxController/xxx_query")
                        .contentType(MediaType.APPLICATION_JSON_UTF8)      
                        .param("xxx","xxx")

        )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        System.out.println(result);
    }
}

作者:https迷路了
鏈接:http://www.reibang.com/p/13408dd4bef7
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處铺敌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汇歹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子适刀,更是在濱河造成了極大的恐慌秤朗,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笔喉,死亡現(xiàn)場離奇詭異取视,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)常挚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門作谭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奄毡,你說我怎么就攤上這事折欠。” “怎么了吼过?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵锐秦,是天一觀的道長。 經(jīng)常有香客問我盗忱,道長酱床,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任趟佃,我火速辦了婚禮扇谣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闲昭。我一直安慰自己罐寨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布序矩。 她就那樣靜靜地躺著鸯绿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贮泞。 梳的紋絲不亂的頭發(fā)上楞慈,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音啃擦,去河邊找鬼囊蓝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛令蛉,可吹牛的內(nèi)容都是我干的聚霜。 我是一名探鬼主播狡恬,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝎宇!你這毒婦竟也來了弟劲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤姥芥,失蹤者是張志新(化名)和其女友劉穎兔乞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凉唐,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庸追,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了台囱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淡溯。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖簿训,靈堂內(nèi)的尸體忽然破棺而出咱娶,到底是詐尸還是另有隱情,我是刑警寧澤强品,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布膘侮,位于F島的核電站,受9級特大地震影響的榛,放射性物質(zhì)發(fā)生泄漏喻喳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一困曙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谦去,春花似錦慷丽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妆丘,卻和暖如春锄俄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勺拣。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工奶赠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人药有。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓毅戈,卻偏偏與公主長得像苹丸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子苇经,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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