<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                spring具體完善、強大的單元測試體系。下面,我們使用單元測試來測試班級的保存功能。 首先我們來到controller/KlassController.java,使用alt+enter快捷鍵來快速的生成測試文件: ![](https://img.kancloud.cn/7e/6e/7e6e40b701078ce284c99e87a9781b32_920x409.gif) 如我們所見,經過一系列的操作后IDEA為我們在對應的測試文件夾下生成了對應的測試文件`KlassControolerTest.java`。 ```java package com.mengyunzhi.springBootStudy.controller; import org.junit.Test; import static org.junit.Assert.*; public class KlassControllerTest { @Test ? public void save() { } } ``` * ? 表示save方法為一個測試用例 ![](https://img.kancloud.cn/c3/a4/c3a48574f3990ad6db6d390470221a0c_632x239.png) 點擊此文件的任一綠色箭頭,便可啟動單元測試。此單元測試為基于`junit4`(一個在java下的測試工具)的測試,在此基礎上如想進行Spring項目的單元測試,還需要進行以下配置。 ## Spring單元測試 將測試類使用`@RunWith(SpringRunner.class)`、`@SpringBootTest`來標明該類為一個spring測試類。 conroller/KlassControllerTest.java ``` package com.mengyunzhi.springBootStudy.controller; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; ① import org.springframework.test.context.junit4.SpringRunner; ① import static org.junit.Assert.*; @RunWith(SpringRunner.class) ② @SpringBootTest ② public class KlassControllerTest { @Test public void save() { } } ``` ## 測試SAVE方法 想測試控制器中的save方法,我們需要一個叫做`MockMvc 模擬MVC`的家伙來幫忙。 controller/KlassControllerTest.java ``` import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.test.web.servlet.MockMvc; ... @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc ? public class KlassControllerTest { @Autowired ? MockMvc mockMvc; @Test public void save() { } } ``` * ? 在此類中自動配置MockMvc * ? 自動裝配MockMvc對象 ### 模擬POST請求 代碼如下: ``` import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; ... @Test public void save() throws Exception { ? String url = "/Klass"; ? MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders.post(url) ? .contentType("application/json;charset=UTF-8") ? .content("{\"name\":\"測試單元測試班級\"}") ?; this.mockMvc.perform(postRequest)? .andDo(MockMvcResultHandlers.print()?) ? .andExpect(MockMvcResultMatchers.status().is(201));? } ``` * ? 請求地址,注意**不**需要`http://localhost:8080`。 * ? 構建一個指向url的模擬POST請求。 * ? 當前發送數據的格式為json;發送數據的編碼為utf-8(可省略)。 * ? 發送的主體內容為:`{"name":"測試單元測試班級"}`,其中`\"`為`"`的轉義符號,用于在字符串中輸入`"`。 * ? 發送剛剛構建的postRequest請求。 * ? 該請求可能得不到正確的執行(比如URL地址寫錯了),未正常執行時將拋出異常。 * ? 成功發送請求后... * ? 打印請求的結果到控制臺 * ? 然后進行斷言 * ? 斷言返回的狀態碼為201 > 閱讀一些長的代碼時,要嘗試將其做為課文來讀。至于這些功能是如何具體實現的,在面向對象的世界里,我們并不關心。 與augular的單元測試一樣,spring的單元測試也可以獨立進行,所以在執行單元測試前,我們完全停止項目的運行: ![](https://img.kancloud.cn/07/6b/076b40e5bdc87347800f037d25455111_647x98.png) 然后執行單元測試: ![](https://img.kancloud.cn/67/84/6784d510335e44a3fc105ff11c6a3d9b_748x156.png) 在測試方法前顯示了綠色的對勾,表明該方式測試通過。 ### 測試中加入教師信息 在前面的測試中加入教師信息時,首先在數據庫中了添加一條用于測試的教師信息: ![](https://img.kancloud.cn/ef/db/efdb234810f24d091a75bb34ba0fe6ee_678x123.png) 在此時由于后臺整個項目未啟動,所以此時數據庫中并沒有任何數據表(每次系統啟動時創建新表、停止時刪除創建的表),那么當然也就無法向數據表中添加用于測試的教師數據了。其實即使是我們想辦法添加了測試的數據,單元測試在啟動時也會自動去刪除原有的數據表然后創建空的數據的表,所以只要我們的數據表策略是`create-drop`,那么就沒有辦法使用原來的方法添加測試教師數據。 每次單元測試時都清空數據表在單元測試中非常有必要的,這保證了我們每次啟動單元測試時數據的初始環境都是一致的,減少了單元測試在不同環境下的不確定性。那么此時如果想添加測試教師,則需要在代碼中進行添加: #### TeacherReopository 前面我們建立了操作Klass表的KlassRepository,參考該文件我們建立操作Teacher表的TeacherRepository repository/TeacherRepository.java ``` package com.mengyunzhi.springBootStudy.repository; import com.mengyunzhi.springBootStudy.entity.Teacher; import org.springframework.data.repository.CrudRepository; /** * 教師倉庫 */ public interface TeacherRepository extends CrudRepository<Teacher, Long> { } ``` #### 自動裝配 接著來到需要使用該倉庫進行數據新增的controller/KlasscontrollerTest.java ```java import com.mengyunzhi.springBootStudy.repository.TeacherRepository; ... public class KlassControllerTest { @Autowired MockMvc mockMvc; /*教師倉庫*/ @Autowired TeacherRepository teacherRepository; ① @Test public void save() throws Exception { ``` ### 請求主體中加入教師信息 最后,我們在單元測試中利用teacherRepository來新建一個測試教師,最獲取其ID放置到POST請求的主體中。 controller/KlasscontrollerTest.java ``` /*教師倉庫*/ @Autowired TeacherRepository teacherRepository; ① @Test public void save() throws Exception { Teacher teacher = new Teacher(); ? teacher.setName("潘杰"); ? teacher.setEmail("panjie@yunzhiclub.com"); ? teacher.setUsername("panjie"); ? teacherRepository.save(teacher); ? String content = String.format("{\"name\":\"測試單元測試班級\", \"teacher\": {\"id\":%s}}", teacher.getId()); ? String url = "/Klass"; MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders.post(url) .contentType("application/json;charset=UTF-8") .content(content); ② this.mockMvc.perform(postRequest) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().is(201)); } ``` * ? 實例化教師 * ? 設置教師的屬性 * ? 將教師保存到數據庫中 * ? 拼接請求主體對應的字符串 測試: ``` MockHttpServletRequest: HTTP Method = POST Request URI = /Klass Parameters = {} Headers = [Content-Type:"application/json;charset=UTF-8"] Body = {"name":"測試單元測試班級", "teacher": {"id":1}} Session Attrs = {} ``` ### 添加斷言 我們前面的測試確認了以下內容: * [ ] 請求的地址是正確的 * [ ] 按接口發送數據,后臺是能夠成功接收的 * [ ] 后臺處理后,返回201的狀態碼 但數據是否真的被保存成功了呢?下面,我們加入數據保存成功的斷言。 ```java import org.junit.Assert; /*班級*/ @Autowired KlassRepository klassRepository; ① /** * 班級保存測試 * 1. 建立一個供測試的教師 * 2. 拼接請求的JSON串 * 3. 模擬請求并斷言返回了201 * 4. 斷言新增數據成功 * @throws Exception */ @Test public void save() throws Exception { Teacher teacher = new Teacher(); teacher.setName("潘杰"); teacher.setEmail("panjie@yunzhiclub.com"); teacher.setUsername("panjie"); teacherRepository.save(teacher); String content = String.format("{\"name\":\"測試單元測試班級\", \"teacher\": {\"id\":%s}}", teacher.getId()); String url = "/Klass"; MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders.post(url) .contentType("application/json;charset=UTF-8") .content(content); this.mockMvc.perform(postRequest) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().is(201)); List<Klass> klasses = (List<Klass>)? this.klassRepository.findAll(); ? Assert.assertEquals(klasses.size(), 1); ? Klass klass = klasses.get(0); ? Assert.assertEquals(klass.getName(), "測試單元測試班級"); ? Assert.assertEquals(klass.getTeacher().getName(), "潘杰"); ? } ``` * ? findAll()查詢出數據表中的全部數據。 * ? 將返回的值轉換為List<Klass>類型。 * ? 斷言有1條班級數據 * ? 獲取該班級數據 * ? 斷言班級的名稱為測試名稱 * ? 斷言班級的中的教師名稱為測試名稱 最行,執行單元測試,測試通過代碼數據添加成功,方法正確。 # 參考文檔 | 名稱 | 鏈接 | 預計學習時長(分) | | --- | --- | --- | | 源碼地址 | [https://github.com/mengyunzhi/spring-boot-and-angular-guild/releases/tag/step3.3.5](https://github.com/mengyunzhi/spring-boot-and-angular-guild/releases/tag/step3.3.5) | - | | Testing the Web Layer | [https://spring.io/guides/gs/testing-web/](https://spring.io/guides/gs/testing-web/) | 15 | | Spring MVC Test Framework | [https://docs.spring.io/spring/docs/5.2.1.RELEASE/spring-framework-reference/testing.html#spring-mvc-test-framework](https://docs.spring.io/spring/docs/5.2.1.RELEASE/spring-framework-reference/testing.html#spring-mvc-test-framework) | 30 |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看