項目測試之MockMvc

文章目錄

  • 基礎
    • 基礎概念
    • Mockxxx
    • 一般實現
    • 文件位置
  • 實戰
    • MockMvc與Test注解不兼容
    • @RequestParams參數
    • @RequestBody參數

基礎

基礎概念

定義:是Spring框架提供的一種用于測試Spring MVC控制器的工具,它允許開發者在不啟動完整的web服務器的情況下,模擬HTTP請求并驗證響應。優點:執行速度快 --》 不需要啟動web服務器;便于集成 --》 可以與JunitTestNG等測試框架無縫銜接;強大的功能 --》  對HTTP請求的詳細配置和響應的全面驗證;依賴配置:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

Mockxxx

MockMvc:來自于:import org.springframework.test.web.servlet.MockMvc;定義:是Spring Test模塊的一部分,它允許開發者對Spring MVC控制器進行單元測試而無需啟動完整的Web服務器;通過MockMvc,可以模擬HTTP請求并驗證響應,使得測試執行速度更快,同時便于與JUnitTestNG等測試框架集成。使用:使用mockMvc。perform()模擬HTTP請求,使用.andExpect().andReturn()等方法進行響應驗證。
Mockito:來自于:import org.mockito.Mockito;定義:流行的Java單元測試框架,專門用于創建和驗證模擬對象的行為。它允許開發者在編寫測試時模擬外部依賴,從而使得測試更便捷,減少對外部類、系統和依賴給單元測試帶來的耦合。特點:行為驗證、測試樁、參數匹配器、注冊支持、監控真實對象、重置mock對象;
MvcResult:來自于:import org.springframework.test.web.servlet.MvcResult;定義:是在執行模擬HTTP請求以測試控制器(Controller)層功能時的重要概念,它代表一個完整的HTTP響應結果,包括響應的狀態碼、頭信息、響應體以及任何可能產生的錯誤等。作用:封裝HTTP響應 -》封裝由模擬的HTTP產生的完整響應信息;獲取響應細節 -》包括響應的狀態碼、頭信息、響應體等內容;斷言測試 -》 使用MvcResult中的方法進行斷言,確保控制器返回正確的HTTP狀態碼和數據;

一般實現

// 類注解,用于配置 JUnit 5 測試類以使用 Spring 的測試支持。
@ExtendWith(SpringExtension.class)// 是一個 Spring Boot 提供的注解,用于對 Web 層(即控制器層)進行測試。如果使用該注解,那么Spring Boot 會自動配置一個模擬的 Spring MVC 環境,這樣就可以在不啟動完整應用的情況下測試控制器的行為。
@WebMvcTest(value = {Controller.class, Handler.class})// 完成bean自動裝配
@Autowired
private MockMvc mockMvc;// 標識測試方法
@Test
MockHttpServletRequestBuilder requestBuilder = get("控制類路徑/xxx/xxx");
// MockHttpServletRequestBuilder 是一個用于構建模擬HTTP請求的工具類。
// 主要在單元測試和集成測試中使用,構造出特定的HTTP請求來測試控制器(Controller)或端點(Endpoint)。
requestBuilder.param("參數名", 參數值);
// 給已創建的mockhttpservletrequestbuilder實例添加查詢參數; 
// 將參數通過鍵值對的形式填入MockHttpServletRequestBuilder對象中;mockMvc.perform(requestBuilder) // mockMvc對象執行,之前定義的requestbuiler對象.andExpect(status().isOk()) // 該調用方式是鏈式調用;--》 用于檢查HTTP響應的狀態碼是否是200.andDo(new ResultHandler() { // 自定義處理MvcResult對象,即模擬請求后的結果@Overridepublic void handle(MvcResult mvcResult) throws Exception {// 獲取響應體并將其轉化為字符串類型;String content = mvcResult.getResponse().getContentAsString();// 檢查響應體是否為空,以確保有數據返回;assertTrue(StringUtils.isNotBlank(content));// 將響應體內容解析成map集合Map<String, String> resp = JSONUtils.toMap(content);// 驗證code/message 兩個屬性的值是否等于1/success;assertEquals("1", resp.get("code"));assertEquals("success", resp.get("message"));// 獲取data屬性對應的值String data = resp.get("data");// base64解碼byte[] encryptedData = Base64.decode(data);// aes密鑰生成AES aes = genAES(keyIv);// 解密data對應的值String json = new String(aes.decrypt(encryptedData), StandardCharsets.UTF_8);// json format is ResponseKeyCollection 自定義的一個類ResponseKeyCollection collection = JSONUtils.toObject(json, ResponseKeyCollection.class);// 將json轉成 ResponseKeyCollection對象assertEquals(10, collection.getResponseKeys().size());// 驗證對象中getResponseKeys方法返回的集合大小是否為10}});@BeforeEach
ResponseKey responseKey1 = COLLECTION.getResponseKeys().stream().filter(key -> key.getIndex() == 1).findFirst().orElse(null);
// COLLECTION獲取ResponseKeys屬性--》轉換為流--》過濾出index=1的responseKey對象
// --》查找第一個滿足條件的--》有則返回,無則返回null;
// COLLECTION 是自定義的對象
Mockito.when(keyStoreService.getResponseKey(1)).thenReturn(responseKey1);
// 模擬該方法,當此入參為1時,則返回上述找到的對象;
Mockito.when(keyStoreService.generateResponseKeyCollection(10)).thenReturn(COLLECTION);
// 模擬該方法,當此入參為10時,則返回Collecion對象;
Mockito.when(keyHelper.isExpiredKeyIndex(anyInt())).thenReturn(false);
// 模擬此方法,不管該方法入參為誰,都返回false --》 即keyIndex永不過期

文件位置

與項目目錄保持一致;
假設項目文件為src/main/java/xxx/controller/xxxController
測試類項目文件為src/test/java/xxx/controller/xxxTest

實戰

MockMvc與Test注解不兼容

參考博客:https://segmentfault.com/q/1010000042943340

描述:使用    @Autowiredprivate MockMvc mockMvc;總是導致注入的mockMvc失敗;
原因是:MockMvc@Test不兼容的問題;原本依賴庫為:org.junit.Test 改成org.junit.jupiter.api.Test 就可以了;兩個依賴庫之間的關系為:org.junit.Test --JUnit4 org.junit.jupiter.api.Test --JUnit5

@RequestParams參數

MockHttpServletRequestBuilder requestBuilder = get("/decrypt");
requestBuilder.param("id1", id1);
requestBuilder.param("id2", id2);
mockMvc.perform(requestBuilder).andExpect(status().isOk()).andDo(mvcResult -> {String content = mvcResult.getResponse().getContentAsString();
});

@RequestBody參數

接口請求參數:
@RequestMapping("/getfunction1")
public ResultDtoRisk riskGetTokenByph(HttpServletRequest request, @RequestBody NumReq numReq){}測試代碼:
@Autowired
pivate MockMvc mockMvc;
// import org.springframework.test.web.servlet.MockMvc;NumReq numReq = new NumReq();
numReq.setId1(id1);
numReq.setId2(id2);MockHttpServletRequestBuilder requestBuilder = get("/getfunction1");
// import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
String requestBodyContent = objectMapper.writeValueAsString(numReq);requestBuilder.contentType(MediaType.APPLICATION_JSON_VALUE).content(requestBodyContent);mockMvc.perform(requestBuilder).andExpect(status().isOk()).andDo(print());

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67371.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67371.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(詳細)Springboot 整合動態多數據源 這里有mysql(分為master 和 slave) 和oracle,根據不同路徑適配不同數據源

文章目錄 Springboot 整合多動態數據源 這里有mysql&#xff08;分為master 和 slave&#xff09; 和oracle1. 引入相關的依賴2. 創建相關配置文件3. 在相關目錄下進行編碼&#xff0c;不同路徑會使用不同數據源 Springboot 整合多動態數據源 這里有mysql&#xff08;分為maste…

計算機網絡之計算機網絡的分類

計算機網絡可以根據不同的角度進行分類&#xff0c;以下是幾種常見的分類方式&#xff1a; 1. 按照規模和范圍&#xff1a; 局域網&#xff08;LAN&#xff0c;Local Area Network&#xff09;&#xff1a;覆蓋較小范圍&#xff08;例如一個建筑物或校園&#xff09;&#xf…

騰訊云開發提供免費GPU服務

https://ide.cloud.tencent.com/dashboard/web 適用于推理場景&#xff0c;每個月10000分鐘免費時長 166 小時 40 分鐘 自帶學術加速&#xff0c;速度還是不錯的 白嫖 Tesla T4 16G 算力 顯存&#xff1a;16GB 算力&#xff1a;8 TFlops SP CPU&#xff1a;8 核 內存&#…

國內外大語言模型領域發展現狀與預期

在數字化浪潮中&#xff0c;大語言模型已成為人工智能領域的關鍵力量&#xff0c;深刻影響著各個行業的發展軌跡。下面我們將深入探討國內外大語言模型領域的發展現狀以及未來預期。 一、發展現狀 &#xff08;一&#xff09;國外進展 美國的引領地位&#xff1a;OpenAI 的 …

存儲過程優化實踐:統一返回結構、參數 JSON 化與事務原子化

存儲過程作為數據庫中執行復雜業務邏輯的重要工具&#xff0c;在提升性能、保障數據一致性和簡化維護方面發揮著重要作用。然而&#xff0c;隨著應用程序和數據的復雜度不斷增加&#xff0c;存儲過程也面臨著性能瓶頸、維護難度和擴展性問題。為了應對這些挑戰&#xff0c;優化…

Lustre Core 語法 - 布爾表達式

Lustre v6 中的 Lustre Core 部分支持的表達式種類中&#xff0c;支持布爾表達式。相關的表達式包括and, or, xor, not, #, nor。 相應的文法定義為 Expression :: not Expression| Expression and Expression| Expression or Expression | Expression xor Expression | # (…

DeepSeek--通向通用人工智能的深度探索者

一、詞源與全稱 “DeepSeek"由"Deep”&#xff08;深度&#xff09;與"Seek"&#xff08;探索&#xff09;組合而成&#xff0c;中文譯名為"深度求索"。其全稱為"深度求索人工智能基礎技術研究有限公司"&#xff0c;英文對應"De…

模板生成引擎技術介紹

模板生成引擎技術介紹 什么是模板生成引擎&#xff1f; 模板生成引擎是一種用于將數據與預定義的格式相結合&#xff0c;以生成最終文檔或網頁的技術。它允許開發者通過定義模板和填充數據來自動化內容創建過程。這種技術廣泛應用于網站開發、報告生成、電子郵件定制等多個領…

第 5 章:聲音與音樂系統

5.1 聲音效果的應用 在游戲中&#xff0c;聲音效果是增強游戲沉浸感和趣味性的重要元素。Pygame 提供了強大的音頻處理功能&#xff0c;使得添加各種聲音效果變得相對簡單。聲音效果可以包括角色的動作音效&#xff0c;如跳躍、攻擊、受傷時的聲音&#xff1b;環境音效&#x…

matlab中,fill命令用法

在 MATLAB 中&#xff0c;fill 命令用于創建填充多邊形的圖形對象。使用 fill 可以在二維坐標系中繪制填充的區域&#xff0c;通常用于繪制圖形的背景或顯示數據分布。 基本語法 fill(X, Y, C)X 和 Y 是同樣長度的向量&#xff0c;定義了多邊形的頂點坐標。C 是顏色&#xff0…

ChatGPT 搜索測試整合記憶功能

據 TestingCatalog 報道&#xff0c;OpenAI 正在測試 ChatGPT 搜索的整合記憶功能&#xff0c;被命名為 “Memory in search”2。以下是關于該功能的具體情況123&#xff1a; 功能特點 個性化搜索&#xff1a;啟用該功能后&#xff0c;ChatGPT 能利用存儲的記憶數據&#xff0…

新站如何快速獲得搜索引擎收錄?

本文來自&#xff1a;百萬收錄網 原文鏈接&#xff1a;https://www.baiwanshoulu.com/8.html 新站想要快速獲得搜索引擎收錄&#xff0c;需要采取一系列有針對性的策略。以下是一些具體的建議&#xff1a; 一、網站內容優化 高質量原創內容&#xff1a; 確保網站內容原創、…

指定dpkg安裝deb包時的安裝路徑

通過install和ctonrol文件設置安裝路徑 在使用dpkg安裝.deb包時&#xff0c;一般不能直接指定安裝路徑&#xff0c;因為.deb包內部已經定義了文件的安裝位置。這些位置是在打包.deb包時通過控制文件&#xff08;通常是debian/control和debian/install等文件&#xff09;指定的…

開發者交流平臺項目部署到阿里云服務器教程

本文使用PuTTY軟件在本地Windows系統遠程控制Linux服務器&#xff1b;其中&#xff0c;Windows系統為Windows 10專業版&#xff0c;Linux系統為CentOS 7.6 64位。 1.工具軟件的準備 maven&#xff1a;https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-m…

汽車定速巡航

配備定速巡航功能的車型&#xff0c;一般在方向盤附近設有4~6個按鍵&#xff08;可能共用鍵位&#xff09;。 要設置定速巡航&#xff0c;不僅需要方向盤上的按鍵&#xff0c;還要油門配合。 設置的一般流程&#xff1a; 開關&#xff1a;類似步槍上的“保險”&#xff0c;按…

C++11中array容器的常見用法

文章目錄 一、概述二、std::array的特點三、std::array的定義與初始化三、std::array的常用成員函數四、與 C 風格數組的互操作 一、概述 在 C11 中&#xff0c;std::array 是一個新的容器類型&#xff0c;它提供了一個固定大小的數組封裝。相比傳統的 C 風格數組&#xff0c;…

Vue 響應式渲染 - 待辦事項簡單實現

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue 響應式渲染 - 待辦事項簡單實現 目錄 待辦事項簡單實現 頁面初始化 雙向綁定的指令 增加留言列表設置 增加刪除按鈕 最后優化 總結 待辦事項簡單實現 頁面初始化 對頁面進行vue的引入、創建輸入框和按鈕及實例化V…

中文輸入法方案

使用了三年的自然碼雙拼&#xff0c;毫無疑問是推薦使用雙拼輸入法。 三年積累下來的習慣是&#xff1a; 1 自然碼方案 2 空格出字 字母選字 直到如今&#xff0c;想要做出改變&#xff0c;是因為這樣的方案帶來的痛點&#xff1a; 1 使用空格出字就無法使用輔助碼&#…

scrol家族 offset家族 client家族學習

Scroll 系列屬性 scrollTop & scrollLeft scrollTop: 返回元素的內容已向上滾動的部分的高度。scrollLeft: 返回元素的內容已向左滾動的部分的寬度。 scrollHeight & scrollWidth scrollHeight: 返回元素的實際高度&#xff0c;包括由于溢出而在屏幕上不可見的內容…

Python 函數魔法書:基礎、范例、避坑、測驗與項目實戰

Python 函數魔法書&#xff1a;基礎、范例、避坑、測驗與項目實戰 內容簡介 本系列文章是為 Python3 學習者精心設計的一套全面、實用的學習指南&#xff0c;旨在幫助讀者從基礎入門到項目實戰&#xff0c;全面提升編程能力。文章結構由 5 個版塊組成&#xff0c;內容層層遞進…