国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

在Java微服務(wù)項(xiàng)目中,如何使用Mock來(lái)進(jìn)行單元測(cè)試?

0
分享至

摘要:在系統(tǒng)開發(fā)的過程中,單元測(cè)試是其中的一個(gè)重要環(huán)節(jié)。在Java微服務(wù)項(xiàng)目中,Spring框架本身就為我們提供了一套單元測(cè)試的框架SpringBootTest。如果我們?cè)趯W(xué)校完成課堂作業(yè)或出于興趣愛好自學(xué),是可以使用Spring自帶的單元測(cè)試框架進(jìn)行單測(cè)的。

工作中,這種通過SpringBootTest進(jìn)行單元測(cè)試的方式則不推薦使用。其缺點(diǎn)在于,每次執(zhí)行測(cè)試方法都必須啟動(dòng)Spring容器。當(dāng)項(xiàng)目規(guī)模較大、配置較為復(fù)雜時(shí),即使只對(duì)一個(gè)方法進(jìn)行測(cè)試,也需要消耗大量時(shí)間啟動(dòng)Spring容器。當(dāng)我們期望對(duì)DAO層方法進(jìn)行測(cè)試時(shí),該方法還有其他缺點(diǎn):① 如果忘記加進(jìn)行事務(wù)控制的注解,將可能導(dǎo)致數(shù)據(jù)庫(kù)產(chǎn)生“臟數(shù)據(jù)”或數(shù)據(jù)缺失。② 當(dāng)查詢語(yǔ)句涉及大量連表查詢時(shí),查詢效率可能十分低下,執(zhí)行速度緩慢。③ 由于必須根據(jù)數(shù)據(jù)庫(kù)中已有的數(shù)據(jù)來(lái)編寫測(cè)試條件,每次必須先去數(shù)據(jù)庫(kù)確保哪些數(shù)據(jù)存在、哪些數(shù)據(jù)不存在,再編寫對(duì)應(yīng)返回正確值、返回錯(cuò)誤值的單元測(cè)試,開發(fā)效率低下。

針對(duì)上述問題,可能有人會(huì)想到使用H2內(nèi)存數(shù)據(jù)庫(kù)的方式加以解決。不過,這依然無(wú)法有效地解決執(zhí)行單元測(cè)試需要啟動(dòng)Spring容器的問題和上述問題③,假設(shè)我們期望執(zhí)行用戶查詢返回一條姓名為xxx、年齡為xxx的記錄,我們依然需要去sql文件中編寫這一條記錄的插入語(yǔ)句,并且也需要大量的配置。如果有很多條需要模擬的數(shù)據(jù)記錄,就需要?jiǎng)?chuàng)建很多表、編寫很多sql語(yǔ)句,開發(fā)效率依然大打折扣。

此時(shí),有一種很好的解決方案,既不需要和真實(shí)的數(shù)據(jù)庫(kù)交互,也不需要啟動(dòng)Spring容器,同時(shí)又不需要編寫大量的測(cè)試數(shù)據(jù)源,它就是Mock。使用Mock進(jìn)行單元測(cè)試,我們可以直接模擬出結(jié)果,而不需要準(zhǔn)備數(shù)據(jù)源。本文以簡(jiǎn)單的用戶功能為例,說(shuō)明如何使用Mock來(lái)進(jìn)行DAO層的單元測(cè)試。

1、使用Spring原生的方法進(jìn)行測(cè)試。我們假設(shè)ID=1的用戶記錄是存在的,那么查詢結(jié)果必定不為NULL。假設(shè)ID=2的用戶記錄是不存在的,那么查詢結(jié)果必定為NULL。該方式需要啟動(dòng)Spring容器,并與數(shù)據(jù)庫(kù)發(fā)生真實(shí)交互。

2、使用Mock進(jìn)行測(cè)試。該方式不需要啟動(dòng)Spring容器,也不與數(shù)據(jù)庫(kù)發(fā)生真實(shí)交互。

2.1、首先,引入Mock所需的pom依賴

2.2、使用運(yùn)行Mock框架的注解@RunWith(MockitoJUnitRunner.class)

替換Spring原生單元測(cè)試的注解@SpringBootTest

2.3、給Service層對(duì)象加上@InjectMocks注解,給Dao層對(duì)象加上@Mock注解。其中,@InjectMocks注解對(duì)象的方法會(huì)進(jìn)行真實(shí)調(diào)用(會(huì)真實(shí)調(diào)用已編寫的代碼并返回執(zhí)行結(jié)果),而@Mock注解對(duì)象的方法則是進(jìn)行模擬調(diào)用(不會(huì)真實(shí)調(diào)用已編寫的代碼并返回我們?cè)O(shè)置的預(yù)期執(zhí)行結(jié)果)。

2.4、具體的單元測(cè)試方法中,通過Mockito.when(模擬方法).thenReturn(預(yù)期返回值)的方式,進(jìn)行單元測(cè)試。

上述方法中,“Mockito.when(userDAO.findUserById(1L)).thenReturn(new User())”的含義是,當(dāng)userDAO調(diào)用findUserById進(jìn)行查詢且參數(shù)為1L時(shí),會(huì)返回一個(gè)new的User對(duì)象。

同理,“Mockito.when(userDAO.findUserById(2L)).thenReturn(null)”的含義是,當(dāng)userDAO調(diào)用findUserById進(jìn)行查詢且參數(shù)為2L時(shí),會(huì)返回一個(gè)空對(duì)象。

當(dāng)測(cè)試涉及的數(shù)據(jù)記錄較多,邏輯較復(fù)雜時(shí),使用Mock模擬DAO層的測(cè)試所提升單元測(cè)試的執(zhí)行效率將更加明顯。

此外,當(dāng)我們本地在開發(fā)調(diào)試時(shí),如果數(shù)據(jù)庫(kù)的測(cè)試數(shù)據(jù)發(fā)生了改變,那么我們單元測(cè)試的結(jié)果也會(huì)受到影響。例如,數(shù)據(jù)庫(kù)中原本存在ID=1的記錄,如果不小心刪掉了,那么我們單測(cè)中Assert.assertNotNull的方法就會(huì)報(bào)錯(cuò)。而如果使用Mock的形式,無(wú)論數(shù)據(jù)庫(kù)中是否存在該記錄,我們執(zhí)行DAO層方法的返回值都只依賴于我們?cè)趖henReturn方法中設(shè)置的值。

總結(jié)一下使用Mock模擬DAO層方法測(cè)試的優(yōu)點(diǎn):

1、不需要啟動(dòng)Spring容器

2、不需要與數(shù)據(jù)庫(kù)發(fā)生真實(shí)交互,不會(huì)導(dǎo)致臟數(shù)據(jù)產(chǎn)生、不會(huì)受到數(shù)據(jù)庫(kù)真實(shí)數(shù)據(jù)的影響、不需要為了單元測(cè)試額外添加/修改/刪除數(shù)據(jù)

3、啟動(dòng)速度快、執(zhí)行速度快、開發(fā)簡(jiǎn)單且效率高

最后:在我的V:atstudy-js,可以費(fèi)領(lǐng)取一份10G軟件測(cè)試工程師面試寶典文檔資料。以及相對(duì)應(yīng)的視頻學(xué)習(xí)教程免費(fèi)分享!其中包括了有基礎(chǔ)知識(shí)、Linux必備、Shell、互聯(lián)網(wǎng)程序原理、Mysql數(shù)據(jù)庫(kù)、抓包工具專題、接口測(cè)試工具、測(cè)試進(jìn)階-Python編程、Web自動(dòng)化測(cè)試、APP自動(dòng)化測(cè)試、接口自動(dòng)化測(cè)試、測(cè)試高級(jí)持續(xù)集成、測(cè)試架構(gòu)開發(fā)測(cè)試框架、性能測(cè)試、安全測(cè)試等。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
Anthropic妥協(xié)了

Anthropic妥協(xié)了

虎嗅APP
2026-02-27 06:00:07
77年李德生探望葉劍英,席間葉帥突然提點(diǎn):你去看看你們的老政委

77年李德生探望葉劍英,席間葉帥突然提點(diǎn):你去看看你們的老政委

談古論今歷史有道
2026-02-28 08:15:03
日本防長(zhǎng)的會(huì)議剛結(jié)束,馬來(lái)西亞發(fā)話:南海問題將無(wú)視中方的主張

日本防長(zhǎng)的會(huì)議剛結(jié)束,馬來(lái)西亞發(fā)話:南海問題將無(wú)視中方的主張

吃貨的分享
2026-03-01 09:17:14
34歲東北姑娘拿下81歲全球首富,長(zhǎng)的很漂亮,一年抱倆娃身價(jià)上億

34歲東北姑娘拿下81歲全球首富,長(zhǎng)的很漂亮,一年抱倆娃身價(jià)上億

云舟史策
2025-09-13 07:37:04
【李國(guó)豪】南京長(zhǎng)江大橋設(shè)計(jì)時(shí),他主張6車道,當(dāng)?shù)卣畧?jiān)持4車道

【李國(guó)豪】南京長(zhǎng)江大橋設(shè)計(jì)時(shí),他主張6車道,當(dāng)?shù)卣畧?jiān)持4車道

年之父
2026-02-23 09:10:06
中美局勢(shì)可能發(fā)生大反轉(zhuǎn),最先超過美國(guó)的竟不是經(jīng)濟(jì)

中美局勢(shì)可能發(fā)生大反轉(zhuǎn),最先超過美國(guó)的竟不是經(jīng)濟(jì)

華人星光
2026-01-07 13:32:47
一夜過去,美伊最新戰(zhàn)事進(jìn)展匯總

一夜過去,美伊最新戰(zhàn)事進(jìn)展匯總

起喜電影
2026-03-01 09:18:01
伊朗伊斯蘭革命衛(wèi)隊(duì)指揮官:伊朗目前使用的只是“廢舊導(dǎo)彈”

伊朗伊斯蘭革命衛(wèi)隊(duì)指揮官:伊朗目前使用的只是“廢舊導(dǎo)彈”

參考消息
2026-03-01 01:29:04
巴拿馬總統(tǒng)警告中國(guó)不要反制,否則報(bào)復(fù),結(jié)果中國(guó)反手就是三連擊

巴拿馬總統(tǒng)警告中國(guó)不要反制,否則報(bào)復(fù),結(jié)果中國(guó)反手就是三連擊

時(shí)尚的弄潮
2026-03-01 08:51:10
王曼昱贏了球,卻用一句話讓對(duì)手紅了眼眶!這才是大將風(fēng)范!

王曼昱贏了球,卻用一句話讓對(duì)手紅了眼眶!這才是大將風(fēng)范!

眼界縱橫
2026-02-28 20:58:39
神算子大伯料事如神,住我家16年,卻不愿將本事傳我,多年后釋然

神算子大伯料事如神,住我家16年,卻不愿將本事傳我,多年后釋然

人間百態(tài)大全
2026-02-28 06:40:03
億萬(wàn)國(guó)人破防!90歲院士平靜宣布,中國(guó)導(dǎo)彈從此沒有任何死角!

億萬(wàn)國(guó)人破防!90歲院士平靜宣布,中國(guó)導(dǎo)彈從此沒有任何死角!

Thurman在昆明
2026-02-28 20:53:27
慘烈的仗,要打到2030年?

慘烈的仗,要打到2030年?

中國(guó)新聞周刊
2026-02-26 22:44:14
18連勝!孫穎莎4-2擊敗早田希娜!賽后日本媒體集體陷入驚恐,發(fā)出一陣陣哀鳴

18連勝!孫穎莎4-2擊敗早田希娜!賽后日本媒體集體陷入驚恐,發(fā)出一陣陣哀鳴

寒律
2026-03-01 02:01:28
史詩(shī)級(jí)封殺!2000萬(wàn)網(wǎng)紅“聽風(fēng)的蠶”徹底涼了

史詩(shī)級(jí)封殺!2000萬(wàn)網(wǎng)紅“聽風(fēng)的蠶”徹底涼了

互聯(lián)網(wǎng)品牌官
2026-02-12 01:17:23
“農(nóng)村太子爺含金量堪比兩斤雞屎!”6個(gè)姐姐給弟弟征婚,被群嘲

“農(nóng)村太子爺含金量堪比兩斤雞屎!”6個(gè)姐姐給弟弟征婚,被群嘲

妍妍教育日記
2026-02-26 19:52:39
天道好輪回!馬筱梅生子后首表態(tài),小S怒罵,前夫里子面子都丟了

天道好輪回!馬筱梅生子后首表態(tài),小S怒罵,前夫里子面子都丟了

有范又有料
2026-02-28 14:43:18
山姆被曝大降價(jià)!深圳門店最新回應(yīng)

山姆被曝大降價(jià)!深圳門店最新回應(yīng)

深圳晚報(bào)
2026-02-28 14:40:56
毛岸英究竟怎么犧牲的?2020年彭德懷發(fā)的絕密電報(bào)公開,寫了什么

毛岸英究竟怎么犧牲的?2020年彭德懷發(fā)的絕密電報(bào)公開,寫了什么

楚風(fēng)說(shuō)歷史
2026-02-18 07:25:03
武漢嵐圖汽車的公積金工資曝光!

武漢嵐圖汽車的公積金工資曝光!

趣味萌寵的日常
2026-02-28 21:00:18
2026-03-01 10:32:49
51Testing軟件測(cè)試網(wǎng) incentive-icons
51Testing軟件測(cè)試網(wǎng)
中國(guó)軟件測(cè)試人的精神家園
1528文章數(shù) 13252關(guān)注度
往期回顧 全部

科技要聞

狂攬1100億美元!OpenAI再創(chuàng)融資神話

頭條要聞

牛彈琴:中東大戰(zhàn)開始 有三個(gè)可怕的后果

頭條要聞

牛彈琴:中東大戰(zhàn)開始 有三個(gè)可怕的后果

體育要聞

球隊(duì)主力全報(bào)銷?頂風(fēng)擺爛演都不演了

娛樂要聞

周杰倫兒子正面照曝光,與父親好像

財(cái)經(jīng)要聞

沖突爆發(fā) 市場(chǎng)變天?

汽車要聞

嵐圖泰山黑武士版3月上市 搭載華為四激光智駕方案

態(tài)度原創(chuàng)

旅游
本地
時(shí)尚
教育
公開課

旅游要聞

春晚一鳴,“爾濱”“燃”冬!百萬(wàn)人潮涌入中央大街,道里區(qū)交出開年最“熱”文旅答卷

本地新聞

津南好·四時(shí)總相宜

普通人穿衣不需要太復(fù)雜!顏色恰當(dāng)、搭配和諧,高級(jí)又耐看

教育要聞

專業(yè)排名百分比揭秘!別再理解錯(cuò)了

公開課

李玫瑾:為什么性格比能力更重要?

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版