




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第十二章SpringBoot的熱部署與單元測試授課教師:陳恒大連外國語大學本章目標理解單元測試的原理掌握開發(fā)的熱部署掌握@WebMvcTest和@SpringBootTest的用法1本章內容212.1開發(fā)的熱部署12.2SpringBoot的單元測試12.1開發(fā)的熱部署12.1.1模板引擎的熱部署12.1.2使用spring-boot-devtools進行熱部署312.1.1模板引擎的熱部署在SpringBoot應用中,使用模板引擎的頁面默認是開啟緩存的,如果修改了頁面內容,則刷新頁面是得不到修改后的頁面的效果。因此,我們可以在配置文件perties中關閉模板引擎的緩存。4關閉Thymeleaf緩存的配置:spring.thymeleaf.cache=false關閉FreeMarker緩存的配置:spring.freemarker.cache=false關閉Groovy緩存的配置:spring.groovy.template.cache=false12.1開發(fā)的熱部署12.1.1模板引擎的熱部署12.1.2使用spring-boot-devtools進行熱部署512.1.2使用spring-boot-devtools進行熱部署在SpringBoot應用的pom.xml文件中添加spring-boot-devtools依賴即可實現(xiàn)頁面和代碼的熱部署。spring-boot-devtools是一個為開發(fā)者服務的模塊,最重要的功能就是自動實現(xiàn)將修改的應用代碼更新到最新的應用上。其工作原理是使用兩個ClassLoader,一個ClassLoader加載那些不會改變的類(如第三方JAR包);一個ClassLoader加載更新的類,稱為RestartClassLoader。這樣在有代碼修改時,原來的RestartClassLoader被丟棄,重新創(chuàng)建一個RestartClassLoader加載更新的類,由于只加載部分修改的類,所以實現(xiàn)了較快的重啟。6【例12-1】使用spring-boot-devtools進行熱部署71.創(chuàng)建基于spring-boot-devtools依賴的SpringBootWeb應用創(chuàng)建基于spring-boot-devtools依賴的SpringBootWeb應用ch12_1。2.創(chuàng)建控制器類
在com.ch.ch12_1包中,創(chuàng)建控制器類TestDevToolsController@RestControllerpublicclassTestDevToolsController{ @RequestMapping("/testDevTools") publicStringtestDevTools(){ return"testDevTools111"; }}4.測試運行8首先,運行Ch121Application主類,啟動應用ch12_1。然后,通過“http://localhost:8080/testDevTools”請求TestDevToolsController類中的testDevTools方法,運行結果如左下圖所示?,F(xiàn)在,我們將testDevTools方法中的return語句修改如下:return"testDevTools222";
無需重啟應用ch12_1,直接刷新“http://localhost:8080/testDevTools”,運行效果如右上圖所示。從【例12-1】看出,spring-boot-devtools實現(xiàn)了代碼修改后的熱部署,同樣,也可實現(xiàn)新增類、修改配置文件等熱部署本章內容912.1開發(fā)的熱部署12.2SpringBoot的單元測試12.2SpringBoot的單元測試12.2.1SpringBoot單元測試程序模板12.2.2測試Service12.2.3測試Controller12.2.4模擬Controller請求12.2.5比較Controller請求返回的結果12.2.6測試實例1012.2.1SpringBoot單元測試程序模板11@SpringBootTestpublicclassGoodsServiceTest{ //注入要測試的service @Autowired privateGoodsServicegoodsService; @Test publicvoidtestGoodsService(){ //調用GoodsService的方法進行測試 }}@SpringBootTest用于SpringBoot應用測試,它默認根據(jù)包名逐級往上找,一直找到SpringBoot主程序(包含@SpringBootApplication注解的類),并在單元測試時啟動該主程序來創(chuàng)建Spring上下文環(huán)境。12.2SpringBoot的單元測試12.2.1SpringBoot單元測試程序模板12.2.2測試Service12.2.3測試Controller12.2.4模擬Controller請求12.2.5比較Controller請求返回的結果12.2.6測試實例1212.2.2測試Service13單元測試Service代碼與通過Controller調用Service代碼相比,需要特別考慮該Service是否依賴其他還未開發(fā)完畢的Service(第三方接口)。如果依賴其他還未開發(fā)完畢的Service,我們需要使用Mockito來模擬未完成的Service。假設,在UserService中依賴CreditService(第三方接口)的getCredit方法獲得用戶積分。@ServicepublicclassUserServiceImplimplementsUserService{@AutowiredprivateCreditServicecreditService;@AutowiredUserRepositoryuserRepository;@OverridepublicintgetCredit(Integeruid){Useruser=userRepository.getOne(uid);if(user!=null) returncreditService.getCredit(uid);else return-1;}}?請思考如何測試UserService呢?問題是單元測試不能實際調用CreditService(因為CreditService是第三方系統(tǒng))。Mockito模擬未完成的Service14importorg.mockito.BDDMockito;importorg.springframework.boot.test.mock.mockito.MockBean;@SpringBootTest@TransactionalpublicclassUserServiceTest{ //注入要測試的service @Autowired privateUserServiceuserService;
@MockBean
privateCreditServicecreditService; @Test publicvoidtestUserService(){ intuid=1; intexpectedCredit=50; /*given是BDDMockito的一個靜態(tài)方法,用來模擬一個Service方法調用返回,anyInt()表示可以傳入任何參數(shù),willReturn方法說明這個調用將返回50。*/ BDDMockito.given(creditService.getCredit(anyInt())).willReturn(expectedCredit); intcredit=userService.getCredit(uid);/*assert定義測試的條件,expectedCredit與credit相等時,assertEquals方法保持沉默,不等時拋出異常*/ assertEquals(expectedCredit,credit); }}在單元測試類中需要使用Mockito的注解@MockBean自動注入Spring管理的Service,用來提供模擬實現(xiàn),在Spring上下文中,CreditService實現(xiàn)已經(jīng)被模擬實現(xiàn)代替了。12.2SpringBoot的單元測試12.2.1SpringBoot單元測試程序模板12.2.2測試Service12.2.3測試Controller12.2.4模擬Controller請求12.2.5比較Controller請求返回的結果12.2.6測試實例1512.2.3測試Controller在SpringBoot應用中,可以單獨測試Controller代碼,用來驗證與Controller相關的URL路徑映射、文件上傳、參數(shù)綁定、參數(shù)校驗等特性。可以通過@WebMvcTest注解來完成Controller單元測試,當然也可以通過@SpringBootTest測試Controller。16
!??!請注意:在使用@WebMvcTest注解測試Controller時,帶有@Service以及別的注解組件類不會自動被掃描注冊為Spring容器管理的Bean,而@SpringBootTest注解告訴SpringBoot去尋找一個主配置類(一個帶@SpringBootApplication的類),并使用它來啟動Spring應用程序上下文,注入所有Bean。另外,還需要注意的是,MockMvc用來在Servlet容器內對Controller進行單元測試,并未真正發(fā)起了HTTP請求調用Controller。
@WebMvcTest用于從服務器端對Controller層進行統(tǒng)一測試;如果需要從客戶端與應用程序交互時,應該使用@SpringBootTest做集成測試。12.2SpringBoot的單元測試12.2.1SpringBoot單元測試程序模板12.2.2測試Service12.2.3測試Controller12.2.4模擬Controller請求12.2.5比較Controller請求返回的結果12.2.6測試實例1712.2.4模擬Controller請求MockMvc的核心方法是:publicResultActionsperform(RequestBuilderrequestBuilder)RequestBuilder類可以通過調用MockMvcRequestBuilders的get、post、multipart等方法來模擬Controller請求。18模擬一個get請求:mvc.peform(get("/getCredit/{id}",uid));模擬一個post請求:mvc.peform(post("/getCredit/{id}",uid));模擬文件上傳:mvc.peform(multipart("/upload").file("file","文件內容".getBytes("UTF-8")));模擬請求參數(shù):mvc.peform(get("/getCredit/{id}/{uname}",uid,uname).param("errorMessage","用戶名或密碼錯誤"));mvc.peform(get("/getCredit/{id}/{uname}",uid,uname).param("job","收銀員","IT"));12.2SpringBoot的單元測試12.2.1SpringBoot單元測試程序模板12.2.2測試Service12.2.3測試Controller12.2.4模擬Controller請求12.2.5比較Controller請求返回的結果12.2.6測試實例1912.2.5比較Controller請求返回的結果MockMvc的perform方法返回ResultActions實例,這個實例代表了請求Controller返回的結果。它提供了一系列andExpect方法來對請求Controller返回的結果進行比較。20mvc.peform(get("/getOneUser/10")) .andExpect(status().isOk())//期望請求成功,即狀態(tài)碼為200 //期望返回內容是application/json .andExpect(content().contentType(MediaType.APPLICATION_JSON)) //使用JsonPath比較返回的JSON內容 .andExpect(jsonPath("$.name").value("chenheng"));//檢查返回內容常見結果比較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.比較轉發(fā)或重定向mvc.peform(post("/addOneUser")) .andExpect(forwardedUrl("/user/selectAll"));//或者redirectedUrl("/user/selectAll")4.比較返回的內容andExpect(content().string("測試很好玩"));//比較返回的字符串a(chǎn)ndExpect(content().xml(xmlContent));//返回內容是XML,并且與xmlContent(變量)一樣andExpect(content().json(jsonContent));//返回內容是JSON,并且與jsonContent(變量)一樣12.2SpringBoot的單元測試12.2.1SpringBoot單元測試程序模板12.2.2測試Service12.2.3測試Controller12.2.4模擬Controller請求12.2.5比較Controller請求返回的結果12.2.6測試實例2212.2.6測試實例分別使用@WebMvcTest和@SpringBootTest兩種方式測試某一個控制器方法是否滿足測試用例?!纠?2-2】使用@WebMvcTest和@SpringBootTest兩種方式測試某一個控制器方法。23例12-2241.創(chuàng)建基于SpringDataJPA依賴的Web應用ch12_2創(chuàng)建基于SpringDataJPA依賴的Web應用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ù)庫驅動spring.datasource.driver-class-name=com.mysql.jdbc.Driver#####JPA持久化配置spring.jpa.database=MYSQL#指定是否在日志中顯示SQL語句spring.jpa.show-sql=true#指定自動創(chuàng)建、更新數(shù)據(jù)庫表等配置,update表示如果數(shù)據(jù)庫中存在持久化類對應的表就不創(chuàng)建,不存在就創(chuàng)建對應的表spring.jpa.hibernate.ddl-auto=update#讓控制器輸出的JSON字符串格式更美觀spring.jackson.serialization.indent-output=true4.創(chuàng)建持久化實體類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; /** *保存學生信息 */ @PostMapping("/save") publicStringsave(@RequestBodyStudentstudent){ studentRepository.save(student); return"success"; } @GetMapping("/getOne/{id}") publicStudentgetOne(@PathVariable("i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園衛(wèi)生教育:正確洗手
- 2025屆陜西省西安市鐵一中高考化學四模試卷含解析
- 2025屆上海市崇明區(qū)高三下學期二模英語試題(含答案)
- 基金的行業(yè)發(fā)展介紹
- 護理病人職業(yè)道德規(guī)范
- 校長在高一年級月考成績質量分析會上講話:-看高一月考成績咱教學得這么調整
- 江功省睢寧縣第一中學2025屆高三考前熱身化學試卷含解析
- 陜西藝術職業(yè)學院《基礎天文學》2023-2024學年第二學期期末試卷
- 2025年管業(yè):地暖專用管項目合作計劃書
- 陜西銅川市同官高級中學2025年高三5月模擬(一模)考試化學試題含解析
- 工程詢價記錄表
- 2023年監(jiān)理工程師之水利工程監(jiān)理案例分析真題精選附答案
- 非暴力溝通 情緒篇
- 2023年(第九屆)全國大學生統(tǒng)計建模大賽 論文模板及說明
- 2023-爾雅《星海求知:天文學的奧秘》課后章節(jié)答案
- LY/T 1955-2022林地保護利用規(guī)劃林地落界技術規(guī)程
- 大學成績單(大專)
- 專練11(30題)(網(wǎng)格作圖題)2022中考數(shù)學考點500題(吉林)解析版
- JJF 1367-2012烘干法水分測定儀型式評價大綱
- 醫(yī)院麻醉藥品、精神藥品考試試題及答案
- GB/T 31586.1-2015防護涂料體系對鋼結構的防腐蝕保護涂層附著力/內聚力(破壞強度)的評定和驗收準則第1部分:拉開法試驗
評論
0/150
提交評論