版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十二章SpringBoot的熱部署與單元測(cè)試授課教師:陳恒大連外國(guó)語大學(xué)本章目標(biāo)理解單元測(cè)試的原理掌握開發(fā)的熱部署掌握@WebMvcTest和@SpringBootTest的用法1本章內(nèi)容212.1開發(fā)的熱部署12.2SpringBoot的單元測(cè)試12.1開發(fā)的熱部署12.1.1模板引擎的熱部署12.1.2使用spring-boot-devtools進(jìn)行熱部署312.1.1模板引擎的熱部署在SpringBoot應(yīng)用中,使用模板引擎的頁面默認(rèn)是開啟緩存的,如果修改了頁面內(nèi)容,則刷新頁面是得不到修改后的頁面的效果。因此,我們可以在配置文件perties中關(guān)閉模板引擎的緩存。4關(guān)閉Thymeleaf緩存的配置:spring.thymeleaf.cache=false關(guān)閉FreeMarker緩存的配置:spring.freemarker.cache=false關(guān)閉Groovy緩存的配置:spring.groovy.template.cache=false12.1開發(fā)的熱部署12.1.1模板引擎的熱部署12.1.2使用spring-boot-devtools進(jìn)行熱部署512.1.2使用spring-boot-devtools進(jìn)行熱部署在SpringBoot應(yīng)用的pom.xml文件中添加spring-boot-devtools依賴即可實(shí)現(xiàn)頁面和代碼的熱部署。spring-boot-devtools是一個(gè)為開發(fā)者服務(wù)的模塊,最重要的功能就是自動(dòng)實(shí)現(xiàn)將修改的應(yīng)用代碼更新到最新的應(yīng)用上。其工作原理是使用兩個(gè)ClassLoader,一個(gè)ClassLoader加載那些不會(huì)改變的類(如第三方JAR包);一個(gè)ClassLoader加載更新的類,稱為RestartClassLoader。這樣在有代碼修改時(shí),原來的RestartClassLoader被丟棄,重新創(chuàng)建一個(gè)RestartClassLoader加載更新的類,由于只加載部分修改的類,所以實(shí)現(xiàn)了較快的重啟。6【例12-1】使用spring-boot-devtools進(jìn)行熱部署71.創(chuàng)建基于spring-boot-devtools依賴的SpringBootWeb應(yīng)用創(chuàng)建基于spring-boot-devtools依賴的SpringBootWeb應(yīng)用ch12_1。2.創(chuàng)建控制器類
在com.ch.ch12_1包中,創(chuàng)建控制器類TestDevToolsController@RestControllerpublicclassTestDevToolsController{ @RequestMapping("/testDevTools") publicStringtestDevTools(){ return"testDevTools111"; }}4.測(cè)試運(yùn)行8首先,運(yùn)行Ch121Application主類,啟動(dòng)應(yīng)用ch12_1。然后,通過“http://localhost:8080/testDevTools”請(qǐng)求TestDevToolsController類中的testDevTools方法,運(yùn)行結(jié)果如左下圖所示。現(xiàn)在,我們將testDevTools方法中的return語句修改如下:return"testDevTools222";
無需重啟應(yīng)用ch12_1,直接刷新“http://localhost:8080/testDevTools”,運(yùn)行效果如右上圖所示。從【例12-1】看出,spring-boot-devtools實(shí)現(xiàn)了代碼修改后的熱部署,同樣,也可實(shí)現(xiàn)新增類、修改配置文件等熱部署本章內(nèi)容912.1開發(fā)的熱部署12.2SpringBoot的單元測(cè)試12.2SpringBoot的單元測(cè)試12.2.1SpringBoot單元測(cè)試程序模板12.2.2測(cè)試Service12.2.3測(cè)試Controller12.2.4模擬Controller請(qǐng)求12.2.5比較Controller請(qǐng)求返回的結(jié)果12.2.6測(cè)試實(shí)例1012.2.1SpringBoot單元測(cè)試程序模板11@SpringBootTestpublicclassGoodsServiceTest{ //注入要測(cè)試的service @Autowired privateGoodsServicegoodsService; @Test publicvoidtestGoodsService(){ //調(diào)用GoodsService的方法進(jìn)行測(cè)試 }}@SpringBootTest用于SpringBoot應(yīng)用測(cè)試,它默認(rèn)根據(jù)包名逐級(jí)往上找,一直找到SpringBoot主程序(包含@SpringBootApplication注解的類),并在單元測(cè)試時(shí)啟動(dòng)該主程序來創(chuàng)建Spring上下文環(huán)境。12.2SpringBoot的單元測(cè)試12.2.1SpringBoot單元測(cè)試程序模板12.2.2測(cè)試Service12.2.3測(cè)試Controller12.2.4模擬Controller請(qǐng)求12.2.5比較Controller請(qǐng)求返回的結(jié)果12.2.6測(cè)試實(shí)例1212.2.2測(cè)試Service13單元測(cè)試Service代碼與通過Controller調(diào)用Service代碼相比,需要特別考慮該Service是否依賴其他還未開發(fā)完畢的Service(第三方接口)。如果依賴其他還未開發(fā)完畢的Service,我們需要使用Mockito來模擬未完成的Service。假設(shè),在UserService中依賴CreditService(第三方接口)的getCredit方法獲得用戶積分。@ServicepublicclassUserServiceImplimplementsUserService{@AutowiredprivateCreditServicecreditService;@AutowiredUserRepositoryuserRepository;@OverridepublicintgetCredit(Integeruid){Useruser=userRepository.getOne(uid);if(user!=null) returncreditService.getCredit(uid);else return-1;}}?請(qǐng)思考如何測(cè)試UserService呢?問題是單元測(cè)試不能實(shí)際調(diào)用CreditService(因?yàn)镃reditService是第三方系統(tǒng))。Mockito模擬未完成的Service14importorg.mockito.BDDMockito;importorg.springframework.boot.test.mock.mockito.MockBean;@SpringBootTest@TransactionalpublicclassUserServiceTest{ //注入要測(cè)試的service @Autowired privateUserServiceuserService;
@MockBean
privateCreditServicecreditService; @Test publicvoidtestUserService(){ intuid=1; intexpectedCredit=50; /*given是BDDMockito的一個(gè)靜態(tài)方法,用來模擬一個(gè)Service方法調(diào)用返回,anyInt()表示可以傳入任何參數(shù),willReturn方法說明這個(gè)調(diào)用將返回50。*/ BDDMockito.given(creditService.getCredit(anyInt())).willReturn(expectedCredit); intcredit=userService.getCredit(uid);/*assert定義測(cè)試的條件,expectedCredit與credit相等時(shí),assertEquals方法保持沉默,不等時(shí)拋出異常*/ assertEquals(expectedCredit,credit); }}在單元測(cè)試類中需要使用Mockito的注解@MockBean自動(dòng)注入Spring管理的Service,用來提供模擬實(shí)現(xiàn),在Spring上下文中,CreditService實(shí)現(xiàn)已經(jīng)被模擬實(shí)現(xiàn)代替了。12.2SpringBoot的單元測(cè)試12.2.1SpringBoot單元測(cè)試程序模板12.2.2測(cè)試Service12.2.3測(cè)試Controller12.2.4模擬Controller請(qǐng)求12.2.5比較Controller請(qǐng)求返回的結(jié)果12.2.6測(cè)試實(shí)例1512.2.3測(cè)試Controller在SpringBoot應(yīng)用中,可以單獨(dú)測(cè)試Controller代碼,用來驗(yàn)證與Controller相關(guān)的URL路徑映射、文件上傳、參數(shù)綁定、參數(shù)校驗(yàn)等特性??梢酝ㄟ^@WebMvcTest注解來完成Controller單元測(cè)試,當(dāng)然也可以通過@SpringBootTest測(cè)試Controller。16
?。?!請(qǐng)注意:在使用@WebMvcTest注解測(cè)試Controller時(shí),帶有@Service以及別的注解組件類不會(huì)自動(dòng)被掃描注冊(cè)為Spring容器管理的Bean,而@SpringBootTest注解告訴SpringBoot去尋找一個(gè)主配置類(一個(gè)帶@SpringBootApplication的類),并使用它來啟動(dòng)Spring應(yīng)用程序上下文,注入所有Bean。另外,還需要注意的是,MockMvc用來在Servlet容器內(nèi)對(duì)Controller進(jìn)行單元測(cè)試,并未真正發(fā)起了HTTP請(qǐng)求調(diào)用Controller。
@WebMvcTest用于從服務(wù)器端對(duì)Controller層進(jìn)行統(tǒng)一測(cè)試;如果需要從客戶端與應(yīng)用程序交互時(shí),應(yīng)該使用@SpringBootTest做集成測(cè)試。12.2SpringBoot的單元測(cè)試12.2.1SpringBoot單元測(cè)試程序模板12.2.2測(cè)試Service12.2.3測(cè)試Controller12.2.4模擬Controller請(qǐng)求12.2.5比較Controller請(qǐng)求返回的結(jié)果12.2.6測(cè)試實(shí)例1712.2.4模擬Controller請(qǐng)求MockMvc的核心方法是:publicResultActionsperform(RequestBuilderrequestBuilder)RequestBuilder類可以通過調(diào)用MockMvcRequestBuilders的get、post、multipart等方法來模擬Controller請(qǐng)求。18模擬一個(gè)get請(qǐng)求:mvc.peform(get("/getCredit/{id}",uid));模擬一個(gè)post請(qǐng)求:mvc.peform(post("/getCredit/{id}",uid));模擬文件上傳:mvc.peform(multipart("/upload").file("file","文件內(nèi)容".getBytes("UTF-8")));模擬請(qǐng)求參數(shù):mvc.peform(get("/getCredit/{id}/{uname}",uid,uname).param("errorMessage","用戶名或密碼錯(cuò)誤"));mvc.peform(get("/getCredit/{id}/{uname}",uid,uname).param("job","收銀員","IT"));12.2SpringBoot的單元測(cè)試12.2.1SpringBoot單元測(cè)試程序模板12.2.2測(cè)試Service12.2.3測(cè)試Controller12.2.4模擬Controller請(qǐng)求12.2.5比較Controller請(qǐng)求返回的結(jié)果12.2.6測(cè)試實(shí)例1912.2.5比較Controller請(qǐng)求返回的結(jié)果MockMvc的perform方法返回ResultActions實(shí)例,這個(gè)實(shí)例代表了請(qǐng)求Controller返回的結(jié)果。它提供了一系列andExpect方法來對(duì)請(qǐng)求Controller返回的結(jié)果進(jìn)行比較。20mvc.peform(get("/getOneUser/10")) .andExpect(status().isOk())//期望請(qǐng)求成功,即狀態(tài)碼為200 //期望返回內(nèi)容是application/json .andExpect(content().contentType(MediaType.APPLICATION_JSON)) //使用JsonPath比較返回的JSON內(nèi)容 .andExpect(jsonPath("$.name").value("chenheng"));//檢查返回內(nèi)容常見結(jié)果比較211.比較返回的視圖mvc.peform(get("/getOneUser/10")) .andExpect(view().name("/userDetail"));2.比較模型mvc.peform(post("/addOneUser")) .andExpect(status().isOk()) .andExpect(model().size(1)) .andExpect(model().attributeExists("oneUser")) .andExpect(model().attribute("oneUser","chenheng"))3.比較轉(zhuǎn)發(fā)或重定向mvc.peform(post("/addOneUser")) .andExpect(forwardedUrl("/user/selectAll"));//或者redirectedUrl("/user/selectAll")4.比較返回的內(nèi)容andExpect(content().string("測(cè)試很好玩"));//比較返回的字符串a(chǎn)ndExpect(content().xml(xmlContent));//返回內(nèi)容是XML,并且與xmlContent(變量)一樣andExpect(content().json(jsonContent));//返回內(nèi)容是JSON,并且與jsonContent(變量)一樣12.2SpringBoot的單元測(cè)試12.2.1SpringBoot單元測(cè)試程序模板12.2.2測(cè)試Service12.2.3測(cè)試Controller12.2.4模擬Controller請(qǐng)求12.2.5比較Controller請(qǐng)求返回的結(jié)果12.2.6測(cè)試實(shí)例2212.2.6測(cè)試實(shí)例分別使用@WebMvcTest和@SpringBootTest兩種方式測(cè)試某一個(gè)控制器方法是否滿足測(cè)試用例?!纠?2-2】使用@WebMvcTest和@SpringBootTest兩種方式測(cè)試某一個(gè)控制器方法。23例12-2241.創(chuàng)建基于SpringDataJPA依賴的Web應(yīng)用ch12_2創(chuàng)建基于SpringDataJPA依賴的Web應(yīng)用ch12_2。2.修改pom.xml文件,引入MySQL依賴修改pom.xml文件,引入MySQL依賴,具體代碼如下:<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version></dependency>3.配置數(shù)據(jù)庫連接等基本屬性25server.servlet.context-path=/ch12_2#數(shù)據(jù)庫地址spring.datasource.url=jdbc:mysql://localhost:3306/springbootjpa?characterEncoding=utf8#數(shù)據(jù)庫用戶名spring.datasource.username=root#數(shù)據(jù)庫密碼spring.datasource.password=root#數(shù)據(jù)庫驅(qū)動(dòng)spring.datasource.driver-class-name=com.mysql.jdbc.Driver#####JPA持久化配置spring.jpa.database=MYSQL#指定是否在日志中顯示SQL語句spring.jpa.show-sql=true#指定自動(dòng)創(chuàng)建、更新數(shù)據(jù)庫表等配置,update表示如果數(shù)據(jù)庫中存在持久化類對(duì)應(yīng)的表就不創(chuàng)建,不存在就創(chuàng)建對(duì)應(yīng)的表spring.jpa.hibernate.ddl-auto=update#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true4.創(chuàng)建持久化實(shí)體類26@Entity@Table(name="student_table")/**解決Noserializerfoundforclassxy.pojo.bytebuddy.ByteBuddyInterceptor異常*/@JsonIgnoreProperties(value={"hibernateLazyInitializer"})publicclassStudentimplementsSerializable{ privatestaticfinallongserialVersionUID=1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) privateintid;//主鍵 privateStringsno; privateStringsname; privateStringssex; publicStudent(){ super(); } //省略get方法和set方法}5.創(chuàng)建數(shù)據(jù)訪問層創(chuàng)建名為com.ch.ch12_2.repository的包,并在該包中創(chuàng)建數(shù)據(jù)訪問接口StudentRepository,具體代碼如下:publicinterfaceStudentRepositoryextendsJpaRepository<Student,Integer>{}276.創(chuàng)建控制器層28@RestController@RequestMapping("/student")publicclassStudentController{ @Autowired privateStudentRepositorystudentRepository; /** *保存學(xué)生信息 */ @PostMapping("/save") publicStringsave(@RequestBodyStudentstudent){ studentRepository.save(student); return"success"; } @GetMapping("/getOne/{id}") publicStudentgetOne(@PathVariable("i
溫馨提示
- 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年中國(guó)氣動(dòng)對(duì)夾式刀形閘閥市場(chǎng)調(diào)查研究報(bào)告
- 2025至2031年中國(guó)不銹鋼廣告釘行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國(guó)開背式焊服數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 二零二五版公寓物業(yè)管理與租戶租住服務(wù)合同3篇
- 二零二五版公務(wù)員業(yè)績(jī)?cè)u(píng)估擔(dān)保合同模板下載3篇
- 二零二五年度燃?xì)庠O(shè)備進(jìn)出口貿(mào)易與代理服務(wù)協(xié)議3篇
- cad競(jìng)賽試題及答案
- 音響燈光租賃合同
- 合資入股協(xié)議
- 人教版2022-2023學(xué)年八年級(jí)數(shù)學(xué)上冊(cè)第二次月考測(cè)試題(附答案)
- 2024-2025學(xué)年山東省濰坊市高一上冊(cè)1月期末考試數(shù)學(xué)檢測(cè)試題(附解析)
- 江蘇省揚(yáng)州市蔣王小學(xué)2023~2024年五年級(jí)上學(xué)期英語期末試卷(含答案無聽力原文無音頻)
- 數(shù)學(xué)-湖南省新高考教學(xué)教研聯(lián)盟(長(zhǎng)郡二十校聯(lián)盟)2024-2025學(xué)年2025屆高三上學(xué)期第一次預(yù)熱演練試題和答案
- 決勝中層:中層管理者的九項(xiàng)修煉-記錄
- 幼兒園人民幣啟蒙教育方案
- 臨床藥師進(jìn)修匯報(bào)課件
- 軍事理論(2024年版)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 《無人機(jī)法律法規(guī)知識(shí)》課件-第1章 民用航空法概述
- 政治丨廣東省2025屆高中畢業(yè)班8月第一次調(diào)研考試廣東一調(diào)政治試卷及答案
- 2020-2024年安徽省初中學(xué)業(yè)水平考試中考物理試卷(5年真題+答案解析)
- 鑄石防磨施工工藝
評(píng)論
0/150
提交評(píng)論