問(wèn)題描述
對(duì)于spring api的單元測(cè)試佩抹,我們一直使用MockMvc儡陨。而當(dāng)我把@Runwith@SpringBootTest注釋之后牢撼。發(fā)現(xiàn)使用McokMvc的單元測(cè)試仍然能夠正常執(zhí)行蜈首,最重要的是者娱,不需要啟動(dòng)服務(wù)绪颖。那么對(duì)于單元測(cè)試這種運(yùn)行機(jī)制到底是怎樣的秽荤?
解決思路
- Q1 :對(duì)于單元測(cè)試我們是否應(yīng)該啟動(dòng)服務(wù)?
- A1:對(duì)于單元測(cè)試柠横,我們可能會(huì)在測(cè)試過(guò)程中使用Mockito進(jìn)行某些類(lèi)或者方法或者層的mock王滤,因此我們需要介入服務(wù)的處理部分,因此我們不應(yīng)該啟動(dòng)真的服務(wù)滓鸠。
- Q2:為什么不啟動(dòng)服務(wù)雁乡,MockMvc是如何采用發(fā)請(qǐng)求的方式測(cè)試,也能夠正常的測(cè)試controller的功能糜俗?
- A2:如果沒(méi)有啟動(dòng)服務(wù)測(cè)試就可以運(yùn)行成功踱稍,那么說(shuō)明MockMvc模擬了一種路由匹配機(jī)制,匹配測(cè)試中的請(qǐng)求路徑然后找出對(duì)應(yīng)的controller然后對(duì)函數(shù)進(jìn)行測(cè)試悠抹,這樣就能解釋當(dāng)你的服務(wù)并沒(méi)有被啟動(dòng)珠月,卻可以被controller服務(wù)。
---->因此MockMvc不能用來(lái)進(jìn)行集成測(cè)試楔敌,因?yàn)樗荒苷嬲娜ソo服務(wù)器發(fā)送請(qǐng)求啤挎,所以沒(méi)有辦法測(cè)試服務(wù)器就收請(qǐng)求和對(duì)請(qǐng)求處理返回的過(guò)程
- Q3:使用注釋@Runwith和@SpringBootTest(classes = Application.class)有什么作用
- A3:Junit4引入了測(cè)試注解@Runwit標(biāo)注測(cè)試使用的Runner,一般都會(huì)用在測(cè)試類(lèi)之前修飾測(cè)試類(lèi)@SpringBootTest(classes = Application.class)加載運(yùn)行類(lèi)的所有資源卵凑,配置
- *例子:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class,webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,properties = {
"server.port=8081"} )
第二個(gè)注解:加載服務(wù)類(lèi)所需的所有資源配置庆聘,并設(shè)置服務(wù)啟動(dòng)端口是8081
第一個(gè)注解:作為運(yùn)行器啟動(dòng)第二個(gè)注解引入的服務(wù)
- Q4:那么對(duì)于單元測(cè)試到底需要哪些注解呢?
- A4:因?yàn)閱卧獪y(cè)試不需要服務(wù)勺卢,因此我們不需要把服務(wù)資源都加載進(jìn)來(lái)伙判,然而我們需要Junit的于運(yùn)行期運(yùn)行測(cè)試,所以單元測(cè)試只需要@RunWith
反思
- 當(dāng)遇到一個(gè)問(wèn)題黑忱,就去搜索怎么解決這個(gè)問(wèn)題宴抚,找到答案直接粘上勒魔,而沒(méi)有認(rèn)真去查找這些東西作用都是什么,為什么這樣可以解決菇曲。
----> action:以后遇到任何問(wèn)題冠绢,寫(xiě)到記事本并且記錄自己每一步驟的解決辦法,然后晚上整理的時(shí)候添加why再去查資料常潮。理解網(wǎng)上解決辦法為什么這么做