




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章SpringBoot單元測(cè)試學(xué)習(xí)目的與要求本章重點(diǎn)講解SpringBoot單元測(cè)試的相關(guān)內(nèi)容,包括Junit5的注解、斷言以及單元測(cè)試用例。通過本章的學(xué)習(xí),掌握J(rèn)unit5的注解與斷言機(jī)制的用法,掌握單元測(cè)試用例的編寫?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
目錄10.1Junit510.2單元測(cè)試用例10.3使用Postman測(cè)試Controller層《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.1Junit5簡(jiǎn)介JUnit是一個(gè)Java語言的單元測(cè)試框架,是由ErichGamma和KentBeck編寫的一個(gè)回歸測(cè)試框架(RegressionTestingFramework)。Junit測(cè)試是程序員測(cè)試,即所謂白盒測(cè)試,因?yàn)槌绦騿T知道被測(cè)試的軟件如何(How)完成功能和完成什么樣(What)的功能。多數(shù)Java開發(fā)環(huán)境(如:Eclipse、IntelliJIDEA)都已經(jīng)集成了JUnit作為單元測(cè)試工具。JUnit5是由JUnitPlatform、JUnitJupiter以及JUnitVintage三部分組成,Java
運(yùn)行環(huán)境的最低版本是Java8。JUnitPlatform:是Junit提供的平臺(tái)功能模塊,通過JUnitPlatform,其他的測(cè)試引擎都可以接入Junit實(shí)現(xiàn)接口和執(zhí)行。JUnitJUpiter:是Junit5的核心,是一個(gè)基于JUnitPlatform的引擎實(shí)現(xiàn),JUnitJUpiter包含許多豐富的新特性來使得自動(dòng)化測(cè)試更加方便和強(qiáng)大。JUnitVintage:是兼容JUnit3、JUnit4版本的測(cè)試引擎,使得舊版本的自動(dòng)化測(cè)試也可以在Junit5下正常運(yùn)行?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.2Junit5注解1.@Test@Test注解表示方法是單元測(cè)試方法(返回值都是void)。但是與JUnit4的@Test不同,它的職責(zé)非常單一不能聲明任何屬性,拓展的測(cè)試將會(huì)由Jupiter提供額外測(cè)試。示例代碼如下:@TestvoidtestSelectAllUser(){}2.@RepeatedTest@RepeatedTest注解表示單元測(cè)試方法可重復(fù)執(zhí)行,示例代碼如下:@Test@RepeatedTest(value=5)voidfirstTest(){//該測(cè)試方法重復(fù)執(zhí)行5次。
System.out.println(55555);}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.2Junit5注解3.@DisplayName@DisplayName注解為單元測(cè)試方法設(shè)置展示名稱(默認(rèn)為方法名),示例代碼如下:@Test@DisplayName("測(cè)試用戶名查詢方法")voidfindByUname(){}4.@BeforeEach@BeforeEach注解表示在每個(gè)單元測(cè)試方法之前執(zhí)行,示例代碼如下:@BeforeEachvoidsetUp(){}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.2Junit5注解5.@AfterEach@AfterEach注解表示在每個(gè)單元測(cè)試方法之后執(zhí)行,示例代碼如下:@AfterEachvoidtearDown(){}6.@BeforeAll@BeforeAll注解表示在所有單元測(cè)試方法之前執(zhí)行。被@BeforeAll注解的方法,必須為靜態(tài)方法,該靜態(tài)方法將在當(dāng)前測(cè)試類的所有@Test方法前執(zhí)行一次。示例代碼如下:@BeforeAllstaticvoidsuperBefore(){System.out.println("最前面執(zhí)行");}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.2Junit5注解7.@AfterAll@AfterAll注解表示在所有單元測(cè)試方法之后執(zhí)行。被@AfterAll注解的方法,必須為靜態(tài)方法,該靜態(tài)方法將在當(dāng)前測(cè)試類的所有@Test方法后執(zhí)行一次。示例代碼如下:@AfterAllstaticvoidsuperAfter(){System.out.println("最后面執(zhí)行");}8.@Disabled@Disabled注解表示單元測(cè)試方法不執(zhí)行,類似于JUnit4中的@Ignore。9.@Timeout@Timeout注解表示單元測(cè)試方法運(yùn)行時(shí),如果超過了指定時(shí)間將會(huì)返回錯(cuò)誤。示例代碼如下:@Test@Timeout(value=500,unit=TimeUnit.MILLISECONDS)voidtestTimeout()throwsInterruptedException{Thread.sleep(600);}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.3Junit5斷言Junit5的斷言方法都是org.junit.jupiter.api.Assertions的靜態(tài)方法(返回值為void)。1.a(chǎn)ssertEquals和assertNotEqualsAssertions.assertEquals(Objectexpected,Objectactual,Stringmessage)方法第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是待測(cè)試方法的實(shí)際返回值,第三個(gè)參數(shù)message是可選的,表示判斷失敗的提示信息。判斷兩者的值是否相等,換言之不判斷類型是否相等。inta=1;longb=1L;
//雖然a和b類型不同,但依舊判斷是成功的,當(dāng)a與b不相等時(shí),測(cè)試不通過。assertEquals(a,b,"a與b不相等");MyUserau=newMyUser();MyUserbu=newMyUser();//雖然au和bu是指向不同的對(duì)象,但它們值相同,依舊判斷是成功的。assertEquals(au,bu,"au與bu的對(duì)象屬性值不相等");bu.setUname("ch");assertEquals(au,bu,"au與bu的對(duì)象屬性值不相等");《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.3Junit5斷言2.a(chǎn)ssertSame和assertNotSameassertSame與assertEquals的區(qū)別,assertSame不僅判斷值是否相同,還判斷類型是否相同。對(duì)于對(duì)象,判斷兩者的引用是否是同一個(gè)。inta=1;longb=1L;longc=1L;//b和c比較,判斷成功,因?yàn)樗麄兊念愋鸵蚕嗤ssertSame(b,c,"測(cè)試失敗");//a和b比較,判斷失敗,因?yàn)樗麄兊念愋筒幌嗤?。assertSame(a,b,"測(cè)試失敗");MyUserau=newMyUser();MyUserbu=newMyUser();MyUsercu=bu;//bu和cu比較,判斷成功,因?yàn)樗麄兊囊檬峭粋€(gè)。assertSame(bu,cu,"測(cè)試失敗");assertSame(au,bu,"測(cè)試失敗");《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.3Junit5斷言3.a(chǎn)ssertNull和assertNotNullAssertions.assertNull(Objectactual)實(shí)際測(cè)試值是null,則單元測(cè)試成功。4.a(chǎn)ssertTrue和assertFalseAssertions.assertTrue(booleancondition)實(shí)際測(cè)試值是true,則單元測(cè)試成功。《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.3Junit5斷言5.a(chǎn)ssertThrowsAssertions.assertThrows(Class<T>expectedType,Executableexecutable,Stringmessage)判斷executable方法執(zhí)行過程中是否拋出指定異常expectedType。如果沒有拋出異常,或者拋出的異常類型不對(duì),則單元測(cè)試失敗。@TestvoidtestAssertThrows(){
assertThrows(ArithmeticException.class,()->errorMethod());}privatevoiderrorMethod(){inta[]={1,2,3,4,5};for(inti=0;i<=5;i++){System.out.println(a[i]);}}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.3Junit5斷言6.a(chǎn)ssertDoesNotThrowassertDoesNotThrow(Executableexecutable)判斷測(cè)試方法是否拋出異常,如果沒有拋出任何異常,則單元測(cè)試成功。@TestvoidtestAssertDoesNotThrow(){assertDoesNotThrow(()->rightMethod());}privatevoidrightMethod(){inta=1/1;}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.1.3Junit5斷言7.a(chǎn)ssertAllassertAll(Executable...executables)判斷一組斷言是否都成功,都成功,整個(gè)單元測(cè)試成功。@TestvoidtestAll(){
assertAll(()->assertEquals(1,1),()->assertNotEquals(1,2),()->assertNull(null));}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
目錄10.1Junit510.2單元測(cè)試用例10.3使用Postman測(cè)試Controller層《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.2.1測(cè)試環(huán)境構(gòu)建在SpringBootWeb應(yīng)用中,已經(jīng)集成了Junit5和JSON相關(guān)的JAR包,所以可以直接進(jìn)行單元測(cè)試,下面構(gòu)建一個(gè)SpringBootWeb應(yīng)用。1.創(chuàng)建SpringBootWeb應(yīng)用創(chuàng)建基于Lombok依賴的SpringBootWeb應(yīng)用ch10。2.修改pom.xml文件在pom.xml文件中添加MySQL連接器與MyBatis-Plus依賴?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
3.設(shè)置Web應(yīng)用ch10的上下文路徑及數(shù)據(jù)源配置信息server.servlet.context-path=/ch10#數(shù)據(jù)庫地址spring.datasource.url=jdbc:mysql://localhost:3306/springtest?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8#數(shù)據(jù)庫用戶名spring.datasource.username=root#數(shù)據(jù)庫密碼spring.datasource.password=root#數(shù)據(jù)庫驅(qū)動(dòng)spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#設(shè)置包別名(在Mapper映射文件中直接使用實(shí)體類名)mybatis-plus.type-aliases-package=com.ch10.entity#在控制臺(tái)輸出SQL語句日志.ch10.mapper=debug#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
4.創(chuàng)建實(shí)體類創(chuàng)建名為com.ch10.entity的包,并在該包中創(chuàng)建MyUser實(shí)體類。該實(shí)體類與【例7-5】中的相同,不再贅述。5.創(chuàng)建數(shù)據(jù)訪問接口創(chuàng)建名為com.ch10.mapper的包,并在該包中創(chuàng)建UserMapper接口。UserMapper接口通過繼承BaseMapper<MyUser>接口,對(duì)實(shí)體類MyUser對(duì)應(yīng)的數(shù)據(jù)表user進(jìn)行CRUD操作。UserMapper接口的代碼與【例7-5】中的相同,不再贅述。6.創(chuàng)建Service接口及實(shí)現(xiàn)類創(chuàng)建名為com.ch10.service的包,并在該包中創(chuàng)建UserService接口及實(shí)現(xiàn)類UserServiceImpl。UserService接口及實(shí)現(xiàn)類UserServiceImpl的代碼與【例7-5】中的相同,不再贅述?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
7.創(chuàng)建控制器類MyUserController
@AutowiredprivateUserMapperuserMapper;@AutowiredprivateUserServiceuserService;@GetMapping("/selectAllUsers")publicList<MyUser>selectAllUsers(){returnuserMapper.selectList(null);}@PostMapping("/addAUser")publicMyUseraddAUser(MyUsermu){//實(shí)體類主鍵屬性使用@TableId注解后,主鍵自動(dòng)回填
intresult=userMapper.insert(mu);returnmu;}@PutMapping("/updateAUser")publicbooleanupdateAUser(MyUsermu){returnuserService.updateById(mu);
}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
8.在應(yīng)用程序的主類中掃描Mapper接口@SpringBootApplication@MapperScan(basePackages={"com.ch10.mapper"})publicclassCh10Application{publicstaticvoidmain(String[]args){SpringApplication.run(Ch191Application.class,args);}}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.2.2測(cè)試Mapper接口在IntelliJIDEA中,選中類或接口的名字,按下快捷鍵Ctrl+Shift+T創(chuàng)建測(cè)試類,此時(shí)生成的測(cè)試類在test文件夾里面,測(cè)試方法都是void方法。如圖10.1所示的CreateTest窗口?!禨pringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.2.2測(cè)試Mapper接口@SpringBootTest用于SpringBoot應(yīng)用測(cè)試,它默認(rèn)根據(jù)包名逐級(jí)往上找,一直找到SpringBoot主程序(包含@SpringBootApplication注解的類),并在單元測(cè)試時(shí)啟動(dòng)該主程序來創(chuàng)建Spring上下文環(huán)境。所以,需要在單元測(cè)試類上使用@SpringBootTest注解標(biāo)注后,才能進(jìn)行單元測(cè)試。在測(cè)試類UserMapperTest中,使用Junit5的注解與斷言進(jìn)行Mapper接口方法的測(cè)試。@AutowiredprivateUserMapperuserMapper;@TestvoidgetOne(){ MyUsermu=userMapper.selectById(1);
assertEquals(mu.getUid(),1,"a與b不相等");
}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.2.3測(cè)試Service層單元測(cè)試Service層與測(cè)試Mapper接口類似,需要特別考慮Service是否依賴其他還未開發(fā)完畢的Service(第三方接口)。如果依賴其他還未開發(fā)完畢的Service,我們需要使用Mockito(JavaMock測(cè)試框架,用于模擬任何Spring管理的Bean)來模擬未完成的Service。假設(shè),應(yīng)用ch10的UserServiceImpl類依賴一個(gè)還未開發(fā)完畢的第三方接口UsexService。接口UsexService中有一個(gè)獲得用戶性別的接口方法getUsex。publicinterfaceUsexService{StringgetUsex(intid);}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
10.2.3測(cè)試Service層創(chuàng)建UserServiceImpl的測(cè)試類UserServiceImplTest,在UserServiceImplTest類中,使用Mockito.mock方法模擬第三方接口UsexService的對(duì)象,并進(jìn)行測(cè)試。@SpringBootTestclassUserServiceImplTest{@AutowiredprivateUserServiceuserService;//模擬第三方接口UsexService對(duì)象privateUsexServiceusexService=Mockito.mock(UsexService.class);@TestvoidtestGetOne(){intuid=1;StringexpectedUsex="女";/*given是BDDMockito的一個(gè)靜態(tài)方法,用來模擬一個(gè)Service方法調(diào)用返回,anyInt()表示可以傳入任何參數(shù),willReturn方法說明這個(gè)調(diào)用將返回女。*/
BDDMockito.given(usexService.getUsex(anyInt())).willReturn(expectedUsex);
assertEquals(expectedUsex,userService.getById(uid).getUsex(),"測(cè)試失敗,與期望值不一致");}}《SpringBoot從入門到實(shí)戰(zhàn)(第2版·微課視頻版)》陳恒
主編,清華大學(xué)出版社,2024
目錄10.1Junit510.2單元測(cè)試用例10.3使用Postman測(cè)試Controller層《SpringBoot從入門到實(shí)戰(zhàn)(第
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)面膜行業(yè)競(jìng)爭(zhēng)格局及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)隔音玻璃產(chǎn)業(yè)運(yùn)營(yíng)狀況與發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025-2030年中國(guó)鏈鋸行業(yè)十三五規(guī)劃與發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2025-2030年中國(guó)資產(chǎn)管理行業(yè)運(yùn)行動(dòng)態(tài)與營(yíng)銷策略研究報(bào)告
- 2025-2030年中國(guó)聚苯醚行業(yè)風(fēng)險(xiǎn)評(píng)估規(guī)劃分析報(bào)告
- 南寧理工學(xué)院《美國(guó)文學(xué)選讀》2023-2024學(xué)年第二學(xué)期期末試卷
- 邢臺(tái)醫(yī)學(xué)高等??茖W(xué)校《生態(tài)文明建設(shè)理論與實(shí)踐前沿》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西科技學(xué)院《公共管理與服務(wù)課程開發(fā)與教材分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 贛南師范大學(xué)科技學(xué)院《海報(bào)設(shè)計(jì)(數(shù)字方向)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025安徽省安全員知識(shí)題庫及答案
- 金波讀書樂課件
- 靜脈治療輸液工具的選擇2024課件
- KTV常見飛單方法
- 2024肥胖癥診療指南亮點(diǎn)內(nèi)容解讀課件
- 課程設(shè)計(jì)存在問題和建議
- 四川蜀道集團(tuán)筆試題
- 耐甲氧西林肺炎鏈球菌(MRSP)的流行病學(xué)和分子流行病學(xué)
- DBJ50-T-420-2022建設(shè)工程配建5G移動(dòng)通信基礎(chǔ)設(shè)施技術(shù)標(biāo)準(zhǔn)
- 2023年全國(guó)職業(yè)院校技能大賽-健身指導(dǎo)賽項(xiàng)規(guī)程
- 年“春節(jié)”前后安全自查系列用表完整
- 青島版三年級(jí)下冊(cè)口算題大全(全冊(cè))
評(píng)論
0/150
提交評(píng)論