做資訊類網(wǎng)站需要特殊資質(zhì)嗎網(wǎng)絡(luò)營(yíng)銷文案策劃
void afterReturnName() {
Assertions.assertEquals(studentController.getNameById(123L).getName(), "測(cè)試姓名Yz");
}
}
但往往切面中的邏輯并非這么簡(jiǎn)單,在實(shí)際的測(cè)試中其實(shí)我們也完成沒(méi)有必要關(guān)心在切面中到底發(fā)生了什么(發(fā)生了什么應(yīng)該在測(cè)試切面的方法中完成)。我們?cè)诖酥饕P(guān)心的是切面是否成功的被執(zhí)行了,同時(shí)建立相應(yīng)的斷言,以防止在日后面的代碼迭代過(guò)程中不小心使當(dāng)前的切面失效。
MockBean
Spring Boot為我們提供了 MockBean
?來(lái)直接 Mock
?掉某個(gè) Bean
?。在測(cè)試切面是否成功執(zhí)行時(shí),我們并不關(guān)心 StudentController
?中的 getNameById()
?方法的執(zhí)行邏輯,所以適用于合適 MockBean
?來(lái)聲明。
@SpringBootTest
class AddYzAspectTest {
- @Autowired
- @MockBean
StudentController studentController;
但 MockBean
?并不適合于測(cè)試切面,這是由于 MockBean
?在生成新的代理時(shí)將直接忽略掉相關(guān)切面的注解,導(dǎo)致切面直接失效。
同時(shí) MockBean
?雖然可以用于來(lái)模擬 Controller
?,但如果用它來(lái)模擬Aspect則會(huì)發(fā)生錯(cuò)誤。
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration’: BeanPostProcessor before instantiation of bean failed;
MockSpy
除了 MockBean
?以外,Spring Boot還準(zhǔn)備了攜帶了真正的 Bean
?,但該 Bean
?又可以隨時(shí)按需求 Mock
?掉的,同時(shí)使用該注解生成的 Bean
?并不會(huì)破壞原來(lái)的切面。
class AddYzAspectTest {
@SpyBean
StudentController studentController;
@SpyBean
AddYzAspect addYzAspect;
但在這需要 注意?的 @SpyBean
?雖然成功的生成了兩個(gè)可以被 Mock
?掉的 Bean
?,但在執(zhí)行相應(yīng)的 Mock
?方法時(shí)其對(duì)應(yīng)的切面方法會(huì)自動(dòng)調(diào)用一次。比如以下代碼將自動(dòng)調(diào)用 AddYzAspect
?中的afterReturnName
?方法。
@Test
void afterReturnName() {
StudentController.Student student = new StudentController.Student("test");
Mockito.doReturn(student).when(this.studentController).getNameById(123L); :point\_left:
}
而此時(shí)由于被 Mock
?掉的方法聲明了返回值,所以Mockito則會(huì)使用 null
?來(lái)做為返回值來(lái)訪問(wèn)AddYzAspect
?中的 afterReturnName
?方法。所以此時(shí)則會(huì)發(fā)生了個(gè) NullPointerException
?異常:
java.lang.NullPointerException
at club.yunzhi.smartcommunity.aspects.AddYzAspect.afterReturnName(AddYzAspect.java:14)
所以我們?cè)贛ock被切的方法前,需要提前把切面的相關(guān)方法Mock掉,同時(shí)由于Mock被切方法時(shí)會(huì)以
null
?來(lái)做為方法的返回值,所以在相應(yīng)的參數(shù)上直接寫入null
?即可:
@Test
void afterReturnName() {
Mockito.doNothing().when(this.addYzAspect).afterReturnName(null);
Mockito.doReturn(null).when(this.studentController).getNameById(123L);
完整測(cè)試代碼
@SpringBootTest
class AddYzAspectTest {
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過(guò),也去過(guò)華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)Java工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Java開(kāi)發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Java開(kāi)發(fā)知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新
如果你覺(jué)得這些內(nèi)容對(duì)你有幫助,可以添加V獲取:vip1024b (備注Java)
最后的話
無(wú)論是哪家公司,都很重視Spring框架技術(shù),重視基礎(chǔ),所以千萬(wàn)別小看任何知識(shí)。面試是一個(gè)雙向選擇的過(guò)程,不要抱著畏懼的心態(tài)去面試,不利于自己的發(fā)揮。
同時(shí)看中的應(yīng)該不止薪資,還要看你是不是真的喜歡這家公司,好了希望這篇文章對(duì)大家有幫助!
部分截圖:
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)。不論你是正從事IT行業(yè)的老鳥(niǎo)或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎掃碼加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!
mg-0wwK6pQx-1712761245561)]
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)。不論你是正從事IT行業(yè)的老鳥(niǎo)或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎掃碼加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!
[外鏈圖片轉(zhuǎn)存中…(img-YmWB2CLF-1712761245562)]