Spring Boot測試框架全面解析

Spring Boot測試框架基礎

Spring Boot通過增強Spring測試框架的能力,為開發者提供了一系列簡化測試流程的新注解和特性。該框架建立在成熟的Spring測試基礎之上,通過自動化配置和專用注解顯著提升了測試效率。

核心依賴配置

要使用Spring Boot的全部測試功能,只需在項目中添加spring-boot-starter-test依賴(scope為test)。若通過Spring Initializr創建項目,該依賴已默認包含。該starter提供了完整的測試工具鏈:

org.springframework.bootspring-boot-starter-testtest

主要包含以下測試框架:

  • JUnit 5(默認測試引擎)
  • AssertJ(流式斷言庫)
  • Hamcrest(匹配器庫)
  • Mockito(模擬框架)
  • JSONassert(JSON斷言工具)
  • JsonPath(JSON路徑查詢)
  • Spring Test與Spring Boot Test工具集

核心測試注解

@SpringBootTest注解

作為Spring Boot測試的核心注解,@SpringBootTest顯著簡化了傳統Spring測試中需要多重注解的復雜配置。其核心功能包括:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,properties = {"app.timeout=5000"},args = "--app.name=TestApp",classes = {TestConfig.class}
)
public class IntegrationTest {// 測試代碼
}

關鍵參數說明:

  • webEnvironment:配置Web測試環境
    • MOCK(默認):模擬Servlet環境
    • RANDOM_PORT:隨機端口啟動真實容器
    • DEFINED_PORT:指定端口啟動
    • NONE:非Web環境
  • properties:注入測試屬性
  • args:模擬命令行參數
  • classes:顯式指定配置類

Mock環境測試

默認情況下,@SpringBootTest使用Mock環境測試Web端點,無需啟動實際服務器。結合@AutoConfigureMockMvc可自動配置MockMvc:

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@Testvoid shouldReturnUser() throws Exception {mockMvc.perform(get("/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("TestUser"));}
}

測試切片技術

Spring Boot提供細粒度的"測試切片"機制,允許隔離測試特定層次:

@WebMvcTest

專注控制器層測試,自動配置MockMvc:

@WebMvcTest(UserController.class)
public class UserControllerSliceTest {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate UserService userService;@Testvoid shouldGetUser() throws Exception {when(userService.findById(any())).thenReturn(new User("test"));mockMvc.perform(get("/users/1")).andExpect(content().json("{'name':'test'}"));}
}
@DataJpaTest

專注JPA持久層測試,自動配置數據庫和事務:

@DataJpaTest
@AutoConfigureTestDatabase(replace = NONE)
public class UserRepositoryTest {@Autowiredprivate TestEntityManager entityManager;@Autowired private UserRepository repository;@Testvoid shouldFindByEmail() {entityManager.persist(new User("test@email.com"));User user = repository.findByEmail("test@email.com");assertThat(user).isNotNull();}
}
@JsonTest

專注JSON序列化/反序列化測試:

@JsonTest
public class UserJsonTest {@Autowiredprivate JacksonTester jsonTester;@Testvoid shouldSerialize() throws Exception {User user = new User("test@email.com");JsonContent json = jsonTester.write(user);assertThat(json).extractingJsonPathValue("$.email")).isEqualTo("test@email.com");}
}

測試容器支持

Spring Boot 3.1+原生支持Testcontainers,通過以下注解實現集成測試:

@SpringBootTest
@Testcontainers
public class UserIntegrationTest {@Container@ServiceConnectionstatic PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:15");@Testvoid shouldConnectToDatabase() {// 測試代碼}
}

關鍵注解:

  • @Testcontainers:管理容器生命周期
  • @Container:標記測試容器實例
  • @ServiceConnection:自動配置服務連接

通過這種模塊化的測試方法,開發者可以針對不同層級編寫精確的測試用例,既保證測試覆蓋率,又維持測試執行效率。各測試切片自動配置所需的Spring組件,同時排除無關的自動配置,實現了測試的精準性和高效性。

Mock環境與Web應用測試

Mock環境配置

Spring Boot的@SpringBootTest注解默認采用Mock環境進行Web應用測試,這種模式不會啟動實際服務器,而是通過模擬Servlet環境來測試Web端點。要啟用此功能,需要結合使用@AutoConfigureMockMvc注解和MockMvc類:

@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("mockMvc")
public class UserMockMvcTests {@AutowiredMockMvc mockMvc;@Testvoid createUserTests() throws Exception 

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

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

相關文章

Spring Boot 整合 Spring Data JPA、strategy 的策略區別、什么是 Spring Data JPA

DAY29.2 Java核心基礎 Spring Boot 整合 Spring Data JPA Spring Data JPA根據具體的數據庫分為不同的子模塊&#xff0c;無論是關系型數據庫和非關系型數據庫&#xff0c;Spring Data都提供了支持 Mysql&#xff1a;Spring Data JPA Redis&#xff1a;Spring Data Redis …

Ubuntu 服務器配置與 Cloudflare Tunnel 部署指南 免費內網穿透家用服務器

Ubuntu 服務器配置與 Cloudflare Tunnel 部署指南 本文檔總結了服務器配置相關內容&#xff0c;包括 Ubuntu 服務器配置、硬盤擴容、靜態 IP 設置以及 Cloudflare Tunnel 的部署步驟。 目錄 硬盤分區與擴容設置靜態 IPCloudflare Tunnel 部署SSH 通過 Cloudflare Tunnel常見…

降低實驗檢測報告編制耗時 質檢LIMS系統的應用策略

在質檢工作流程中&#xff0c;檢測報告編制往往是耗時耗力的關鍵環節。傳統人工編制報告不僅效率低下&#xff0c;還容易出現數據錯誤、格式不統一等問題。質檢 LIMS 系統憑借其強大的自動化、智能化功能&#xff0c;為檢測報告編制帶來革命性變革&#xff0c;能夠將編制時間減…

同為.net/C#的跨平臺運行時的mono和.net Core有什么區別?

Mono 和 .NET Core&#xff08;現已統一為 .NET&#xff09;都是 .NET 生態的跨平臺實現&#xff0c;但它們在設計目標、技術特性和應用場景上有顯著區別。以下是詳細對比&#xff1a; ??1. 歷史背景?? ??項目????誕生時間????開發者????當前狀態????Mo…

Android AIDL Hal最低保證出現的問題

1. AIDL HAL 的“最低保證”特性 &#xff08;1&#xff09;協議層級的強制支持 在 IComposer AIDL 接口定義中&#xff08;如 android.hardware.graphics.composer3&#xff09;&#xff0c;Google 已經將部分功能列為 必須支持的特性&#xff08;MUST&#xff09;。例如&am…

蘋果FINDMY和谷歌FIND HUB增強共享位置功能

近期&#xff0c;蘋果Findmy增強了追蹤和分享丟失物品位置方面的功能&#xff0c;“共享物品位置”&#xff0c;用戶可以安全地與航空a公司等第三方分享丟失物品的位置&#xff0c;以便于行李找回。 iOS 18.2的這一新功能使用戶可以輕松、安全地與航空公司等第三方分享AirTag或…

基于GA遺傳優化的FIR濾波器幅頻相頻均衡補償算法matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 在數字信號處理領域&#xff0c;有限沖激響應&#xff08;FIR&#xff09;濾波器因其結構簡單、穩定性好且易于實現線性相位等優點被廣泛應用。然而&#xff0c;實…

雙路物理CPU機器上安裝Ubuntu并部署KVM以實現系統多開

在雙路物理CPU機器上安裝Ubuntu并部署KVM以實現系統多開&#xff0c;并追求性能最優&#xff0c;需要從硬件、宿主機系統、KVM配置、虛擬機配置等多個層面進行優化。 以下是詳細的操作指南和優化建議&#xff1a; 階段一&#xff1a;BIOS/UEFI 設置優化 (重啟進入) 啟用虛擬化…

adb查看、設置cpu相關信息

查內存 adb shell dumpsys meminfo查CPU top -m 10打開 system_monitor adb shell am start -n eu.chainfire.perfmon/.LaunchActivity設置CPU的核心數 在/sys/devices/system/cpu目錄下可以看到你的CPU有幾個核心&#xff0c;如果是雙核&#xff0c;就是cpu0和cpu1&#xff0c…

【Unity基礎】Unity新手實戰教程:用ScriptableObject控制Cube顏色

目錄 項目概述&#x1f6e0;? 完整操作步驟&#xff08;10分鐘內完成&#xff09;步驟1&#xff1a;創建ScriptableObject類步驟2&#xff1a;創建顏色配置資產步驟3&#xff1a;創建Cube控制器步驟4&#xff1a;設置場景和Cube步驟5&#xff1a;添加簡單UI提示步驟6&#xff…

One Year~

入局 作為科班學生&#xff0c;沒事就在CSDN閑逛&#xff0c;只作為旁觀者的身份去體會別人的好文。當時也沒想著說去自己寫一些博客記錄學習過程。相信大多數同學和我有一樣的心理。 但在看魚皮哥的課程時&#xff0c;發現他有著寫文檔和博客的習慣&#xff0c;整理自己的思路…

【Redis】第3節|深入理解Redis線程模型

一、Redis基礎認知 &#xff08;一&#xff09;定義與定位 Redis&#xff08;Remote Dictionary Server&#xff09;是開源高性能鍵值數據庫&#xff0c;核心特點如下&#xff1a; 數據結構豐富&#xff1a;支持字符串、哈希、列表、集合、有序集合等復雜數據類型&#xff0…

vben-admin 2.8.0 版本修改 axios響應處理邏輯

此前端框架下的 Axios 在后端返回的結果老是無法正常解析&#xff0c;找到他源碼的封裝類&#xff0c;修正這個問題 文件位于 src\utils\http\axios\index.ts 修改前 transformResponseHook: (res: AxiosResponse<Result>, options: RequestOptions) > {const { t }…

深入理解JavaScript設計模式之原型模式

目錄 前言引入原型模式頭腦風暴傳統方式 vs 原型模式實戰案例&#xff1a;飛機大戰中的分身術 原型模式實現的關鍵秘密實戰演練&#xff1a;造一架能分身的飛機克隆是創建對象的手段原型模式&#xff1a;輕裝上陣的造物術 原型編程范型的一些規則原型編程的四大門規&#xff1a…

【數據庫】概述(純理論)

數據庫系統引論 數據管理系統的發展 數據管理&#xff1a;對數據分類、組織、編碼、存儲、檢索、維護 發展&#xff1a;人工管理、文件系統、數據庫系統 40-50年代 人工管理 數據不保存&#xff0c;沒有專門軟件管理數據&#xff0c;應用程序完全依賴于數據&#xff0c;數據…

語音合成之十七 語音合成(TTS)中文自然度:問題、成因、解決方案

語音合成&#xff08;TTS&#xff09;中文自然度&#xff1a;問題、成因、解決方案 中文TTS系統基本架構中文TTS常見問題深度剖析與解決方案音色跳變成因分析解決方案 聲調與重讀錯誤成因分析業界解決方案 漏讀與斷句錯誤成因分析業界解決方案 在跨語言TTS系統比較中&#xff0…

我在 Linux 進程管理中踩過的坑:僵尸、瞬時與不可中斷進程實戰實錄

作為運維老鳥&#xff0c;我曾在 Linux 進程管理上栽過不少跟頭。記得第一次遇到滿屏僵尸進程時&#xff0c;服務器直接卡到連 SSH 都登不上&#xff0c;看著ps命令里一排排刺眼的Z狀態進程&#xff0c;手心直冒冷汗。后來又碰到過瞬時進程搞崩日志系統&#xff0c;明明監控顯示…

【設計模式】簡單工廠模式,工廠模式,抽象工廠模式,單例,代理,go案例區分總結

工廠模式三種類型&#xff1a; 一、簡單工廠模式&#xff08;Simple Factory&#xff09; 定義&#xff1a; 用一個工廠類&#xff0c;根據傳入的參數決定創建哪一種具體產品類實例。 面試說法&#xff1a; 由一個統一的工廠創建所有對象&#xff0c;增加新產品時需要修改工…

某標桿房企BI平臺2.0升級實踐

當房地產行業從“規模競賽”轉向“精益運營”&#xff0c;數字化轉型成為破局關鍵。某千億房企攜手億信華辰&#xff0c;以“用數據重構業務價值鏈”為目標&#xff0c;歷經6個月完成BI平臺戰略性升級。在這場從“數據可視化”到“決策智能化”的躍遷中&#xff0c;億信華辰ABI…

Lua 腳本在 Redis 中的運用-24 (使用 Lua 腳本實現原子計數器)

實踐練習:使用 Lua 腳本實現原子計數器 實現原子計數器是許多應用程序中的常見需求,例如跟蹤網站訪問量、限制 API 請求或管理庫存。雖然 Redis 提供了 INCR 命令用于遞增整數,但在復雜場景或與其他操作結合時直接使用它可能并不足夠。本課程探討了如何在 Redis 中利用 Lua…