Spring Boot 測試詳解,包含maven引入依賴、測試業務層類、REST風格測試和Mock測試

Spring Boot 測試詳解

在這里插入圖片描述


1. 測試依賴引入

Spring Boot 默認通過以下 Maven 依賴引入測試工具:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

該依賴包含 JUnit 5MockitoAssertJ 等核心測試庫,支持單元測試、集成測試和 Mock 測試。


2. IDE 自動創建測試類

IDE(如 IntelliJ/Eclipse)會自動生成測試類,示例如下:

@SpringBootTest
class Chapter15ApplicationTests {@Testvoid contextLoads() {// 驗證應用上下文是否加載成功}
}
  • @SpringBootTest:加載完整的 Spring Boot 應用上下文。
  • @Test:JUnit 5 標注測試方法。

3. 測試注解詳解
注解作用
@SpringBootTest加載完整的 Spring Boot 應用上下文,支持配置 webEnvironment 等參數。
@TestJUnit 5 標注測試方法。
@Autowired從 Spring 容器中注入 Bean。
@MockBean在測試上下文中模擬 Bean(Mockito)。
@WebMvcTest僅加載 Web 層(Controller),不啟動完整上下文。
@DataJpaTest僅加載 JPA 相關配置,用于數據庫測試。

4. 業務層測試

場景:測試 UserServicegetUser() 方法。

@SpringBootTest
class UserServiceTests {@Autowiredprivate UserService userService;@Testvoid testGetUser() {User user = userService.getUser(1L);Assertions.assertNotNull(user, "用戶對象不能為空");}
}
  • 關鍵點
    • 通過 @Autowired 注入業務層 Bean。
    • 使用 Assertions(JUnit 5)或 Assert(JUnit 4)進行斷言。

5. REST 風格測試

場景:測試 REST 接口 /user/{id},使用隨機端口避免沖突。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {@Autowiredprivate TestRestTemplate restTemplate;@Testvoid testGetUser() {User user = restTemplate.getForObject("/user/{id}", User.class, 1L);Assertions.assertNotNull(user, "用戶對象不能為空");}
}
  • 關鍵點
    • webEnvironment = RANDOM_PORT:啟動隨機端口的嵌入式服務器。
    • TestRestTemplate:簡化 REST 接口調用。

6. Mock 測試(Mockito)

場景:模擬 ProductServicegetProduct() 方法。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ProductClientTest {@MockBeanprivate ProductService productService;@Testvoid testMockProduct() {Product mockProduct = new Product(1L, "產品名稱", "產品描述");BDDMockito.given(productService.getProduct(1L)).willReturn(mockProduct);Product result = productService.getProduct(1L);Assertions.assertNotNull(result, "產品對象不能為空");}
}
  • 關鍵點
    • @MockBean:在 Spring 上下文中替換真實 Bean 為 Mock。
    • given().willReturn():定義 Mock 方法的返回值。
    • Mockito 風格:BDD 風格(given-when-then)或經典風格(when-thenReturn)。

7. 測試類型總結表
測試類型適用場景關鍵注解/工具
業務層測試業務邏輯驗證(Service 層)@SpringBootTest, @Autowired
REST 接口測試控制器接口(Controller)測試TestRestTemplate, RANDOM_PORT
Mock 測試模擬外部依賴(如未實現的服務)@MockBean, Mockito
集成測試跨層協作測試(如數據庫)@DataJpaTest, @Transactional

8. 注意事項
  • Mockito 版本:Spring Boot 2.x 默認集成 Mockito 3.x,需注意語法差異。
  • 測試隔離:Mock 測試需確保模擬行為僅作用于當前測試方法。
  • 隨機端口:測試時需通過 LocalServerPort 注入實際端口(如需訪問外部 URL)。

通過以上配置和示例,可覆蓋 Spring Boot 應用的各類測試場景,提升代碼質量和開發效率。

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

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

相關文章

DevOps與功能安全:Perforce ALM通過ISO 26262合規認證,簡化安全關鍵系統開發流程

本文來源perforce.com&#xff0c;由Perforce中國授權合作伙伴、DevSecOps解決方案提供商-龍智翻譯整理。 近日&#xff0c;Perforce ALM&#xff08;原Helix ALM&#xff09;通過了國際權威認證機構 TV SD的ISO 26262功能安全流程認證&#xff01;該認證涵蓋Perforce ALM解決方…

Android11車載WiFi熱點默認名稱及密碼配置

一、背景 基于車廠信息安全要求,車載熱點默認名稱不能使用統一的名稱,以及默認密碼不能為簡單的1~9。 基于舊項目經驗,組裝工廠自動化測試及客戶整車組裝的時候均存在多臺設備同時打開,亦不太推薦使用統一的熱點名稱,連接無法區分。 二、需求 根據客戶的要求,默認名稱…

MacOs java環境配置+maven環境配置踩坑實錄

oracl官網下載jdk 1.8的安裝包 注意可能需要注冊&#xff01;&#xff01;&#xff01; 下載鏈接&#xff1a;下載地址點擊 注意晚上就不要下載了 報錯400 &#xff01;&#xff01;&#xff01; 1.點擊安裝嘛 2.配置環境變量 export JAVA_HOME/Library/Java/Java…

如何解讀 /proc/net/netstat

在刷了屏的川普&#xff0c;關稅&#xff0c;AI 大模型和 RDMA 之外的一股清流&#xff0c;來點實用的。 眾所周知 /proc/net/netstat 很難讀&#xff0c;且 netstat 并不是每個系統上都支持 -s&#xff0c;那么對齊該文件給出一個可讀的輸出就是一件高尚的事。可以用 column …

漢化進度100%

P3834 #include<bits/stdc.h> #define int long long #define 定義整型變量 int #define 這是一個常量 const #define 無返回值函數 void #define 這是一個循環條件在后面 for #define 定義結構體 struct #define 如果 if #define 否則 else #define 定義無返回值的 sig…

基于SpringBoot的動物救助中心系統(源碼+數據庫)

500基于SpringBoot的動物救助中心系統&#xff0c;本系統共分為2個角色&#xff1a;系統管理員、用戶&#xff0c;主要功能如下 【管理員】&#xff1a; 1. 登錄&#xff1a;管理員可以通過登錄系統來管理各種功能。 2. 用戶管理&#xff1a;管理員可以查看用戶列表&#xff0…

rockylinux 8 9 升級到指定版本

rockylinux 8 update 指定版本 rockylinux 歷史版 所有版本rockylinux 最新版 所有版本vault歷史版 pub最新版(https://dl.rockylinux.org)地址后面增加不同名稱 echo "delete repos" rm -rf /etc/yum.repos.d/*echo "new rockylinux repo" cat <<EO…

聚焦AI與大模型創新,紫光云如何引領云計算行業快速演進?

【全球云觀察 &#xff5c; 科技熱點關注】 隨著近年來AI與大模型的興起&#xff0c;云計算行業正在發生著一場大變局。 “在2025年春節期間&#xff0c;DeepSeek兩周火爆全球&#xff0c;如何進行私域部署成了企業關心的問題。”紫光云公司總裁王燕平強調指出&#xff0c;AI與…

React8+taro開發微信小程序,實現lottie動畫

安裝核心依賴 npm install lottie-miniprogram tarojs/plugin-html --save修改 Taro 配置 (config/index.js) const config {plugins: [tarojs/plugin-html,// 其他插件...],mini: {canvas: true,webpackChain(chain) {chain.merge({module: {rule: {lottie-loader: {test: …

有效壓縮 Hyper-v linux Centos 的虛擬磁盤 VHDX

參考&#xff1a; http://www.360doc.com/content/22/0505/16/67252277_1029878535.shtml VHDX 有個不好的問題就是&#xff0c;如果在里面存放過文件再刪除&#xff0c;那么已經使用過的空間不會壓縮&#xff0c;導致空間一直被占用。那么就需要想辦法壓縮空間。 還有一點&a…

【力扣hot100題】(089)最長有效括號

這題目真是越做越難了。 但其實只是思路很難想到&#xff0c;一旦會了方法就很好做。 但問題就在方法太難想了…… 思路還是只要遍歷一遍數組&#xff0c;維護動態規劃數組記錄截止至目前位置選取該元素的情況下有效括號的最大值。 光是知道這個還不夠&#xff0c;看了答案…

Ajax------免刷新地前后端交互

本文略帶PHP代碼需要在PHP環境下使用 介紹 AJAX (Asynchronous JavaScript and XML) 是一種創建快速動態網頁應用的開發技術&#xff0c;它允許網頁在不重新加載整個頁面的情況下&#xff0c;與服務器交換數據并更新部分網頁內容。例如&#xff0c;在我們做爬蟲的時候發現有些…

Android 中支持舊版 API 的方法(API 30)

Android 中最新依賴庫的版本支持 API 31 及以上版本&#xff0c;若要支持 API30&#xff0c;則對應的依賴庫的版本就需要使用舊版本。 可通過修改模塊級 build.gradle 文件來進行適配。 1、android 標簽的 targetSdk 和 compileSdk 版本號 根據實際目標設備的 android 版本來…

JDBC注入無外網(上):從HertzBeat聊聊SnakeYAML反序列化

上周日聯合Ar3h 師傅一起&#xff0c;在【代碼審計知識星球】里發布了一個Springboot的小挑戰&#xff1a;https://t.zsxq.com/tSBBZ&#xff0c;這個小挑戰的核心目標是在無法連接外網的情況下&#xff0c;如何利用PSQL JDBC注入漏洞。我會分兩篇文章來講講Java安全的不出網利…

QTreeWidget 手動設置選中項后不高亮的問題

當使用Qt編程QTreeWidget setCurrentItem() 方法設置 QTreeWidget 的當前項時&#xff0c;如果發現選中項顯示為灰色而不是高亮狀態&#xff0c;這通常是由以下幾個原因導致的&#xff1a; 方法1. 焦點問題 ? 確保 QTreeWidget 有焦點 ? 解決方案&#xff1a; cpp treeWidge…

javaSE學習(前端基礎知識)

文章目錄 前言一、HTML1、< th >、< tr > 和 < td >標簽&#xff1a;2、< button > 標簽&#xff1a;3、< input type"text" >&#xff1a;4、< br >&#xff1a; 二、CSS1、選擇器2、聲明塊3、常用屬性及值 三、JS1、Vue 實例對…

c# 數據結構 鏈表篇 有關單鏈表的一切

本人能力有限,本文僅作學習交流與參考,如有不足還請斧正 目錄 0.單鏈表好處 0.5.單鏈表分類 1.無虛擬頭節點情況 圖示: 代碼: 頭插/尾插 刪除 搜索 遍歷全部 測試代碼: 全部代碼 2.有尾指針情況 尾插 全部代碼 3.有虛擬頭節點情況 全部代碼 4.循環單鏈表 幾個…

藍橋杯C++組算法知識點整理 · 考前突擊(上)【小白適用】

【背景說明】本文的作者是一名算法競賽小白&#xff0c;在第一次參加藍橋杯之前希望整理一下自己會了哪些算法&#xff0c;于是有了本文的誕生。分享在這里也希望與眾多學子共勉。如果時間允許的話&#xff0c;這一系列會分為上中下三部分和大家見面&#xff0c;祝大家競賽順利…

pipe匿名管道實操(Linux)

管道相關函數 1 pipe 是 Unix/Linux 系統中的一個系統調用&#xff0c;用于創建一個匿名管道 #include <unistd.h> int pipe(int pipefd[2]); 參數說明&#xff1a; pipefd[2]&#xff1a;一個包含兩個整數的數組&#xff0c;用于存儲管道的文件描述符&#xff1a; pi…

centos-stream-9上安裝nvidia驅動和cuda-toolkit

這里寫目錄標題 驅動安裝1. 更新系統2. NVIDIA GPU安裝檢查系統是否安裝了 NVIDIA GPU2.1 首先&#xff0c;使用以下命令更新 DNF 軟件包存儲庫緩存&#xff1a;2.2 安裝編譯 NVIDIA 內核模塊所需的依賴項和構建工具2.3 在 CentOS Stream 9 上添加官方 NVIDIA CUDA 軟件包存儲庫…