SpringBoot 集成JUnit5的詳細(xì)操作過程
一、JUnit5介紹
JUnit5是一個功能強大的單元測試
框架,是JUnit系列的最新版本,它引入了多個改進(jìn)和新特性,旨在為Java應(yīng)用程序提供靈活且模塊化的測試支持。
1、JUnit5組成結(jié)構(gòu)
- JUnit Platform:這個模塊提供了測試的
啟動API和運行環(huán)境
,是整個JUnit5框架的核心。它支持在不同的環(huán)境中運行測試,如命令行、IDE或構(gòu)建工具(例如Maven、Gradle) - JUnit Jupiter:這個模塊包含了JUnit5的
新測試編寫和擴展模型
,提供了全新的注解、測試方法和擴展機制 - JUnit Vintage:為了支持舊版本的JUnit測試(JUnit3和JUnit4),JUnit5提供了Vintage模塊。這個模塊允許開發(fā)者繼續(xù)運行以前版本的測試,同時過渡到JUnit5
2、什么是單元測試
- 單元測試是指對軟件中的
最小可測試單元
進(jìn)行檢查和驗證的過程叫單元測試
- 在
SpringBoot
中,最小可測試單元就是指方法
二、SpringBoot整合JUnit5
1、快速入門
SpringBoot版本從2.2
以后,默認(rèn)支持JUnit5
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
測試類應(yīng)放在src/test/java
目錄下
import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class MySpringBootApplicationTests { @Test void contextLoads() { // 測試 Spring 應(yīng)用上下文是否成功加載 } }
2、測試類和測試方法不需要聲明為public
- 在
JUnit4
中,測試類和測試方法必須是public
的,因為JUnit4通過反射機制要求訪問公共方法 - 而
JUnit5
則沒有這種要求,測試類和方法的可見性設(shè)為包級(默認(rèn))
足夠 JUnit 5 框架執(zhí)行測試- 因為 JUnit 5 本質(zhì)上是在測試框架內(nèi)部執(zhí)行這些測試
- 包級別的可見性允許同一包內(nèi)的類訪問測試類,而不需要將其暴露為 public
3、@SpringBootTest工作原理
它會啟動整個Spring容器
,加載應(yīng)用程序的所有Bean
,并創(chuàng)建一個完整的應(yīng)用上下文
。這是集成測試,因為它模擬了應(yīng)用程序的真實運行環(huán)境。
查找主配置類的兩種方式:
包掃描
:默認(rèn)情況下,@SpringBootTest 會從測試類所在的包開始,向上
查找同一包或父包
中帶有 @SpringBootApplication
或@SpringBootConfiguration
注解的類,作為應(yīng)用的配置類
顯式指定
:如果 @SpringBootTest 無法自動找到 @SpringBootApplication 注解的配置類,或者你希望手動指定配置類,你可以在@SpringBootTest
注解中使用classes
屬性顯式指定應(yīng)用的配置類
4、生成單元測試類
在需要生成單元測試的類中按Alt +Ins
,選擇test(測試)
選擇測試方法
生成的測試類放入與本類相同的包結(jié)構(gòu)
下
三、常用注解
1、@BeforeAll
用于在所有測試方法之前
執(zhí)行的靜態(tài)
初始化代碼
通常用于在執(zhí)行所有測試之前進(jìn)行一次性設(shè)置,例如建立數(shù)據(jù)庫連接、初始化共享資源等
被注解的方法必須是static
@BeforeAll static void setup() { System.out.println("Running setup before all tests..."); }
2、@AfterAll
- 用于在
所有測試方法執(zhí)行完成后
運行的靜態(tài)
清理代碼 - 通常用于釋放資源、關(guān)閉連接等操作
- 被注解的方法必須是
static
@AfterAll static void tearDown() { System.out.println("Running teardown after all tests..."); }
3、@BeforeEach
- 用于在
每個測試方法之前
執(zhí)行的初始化代碼 - 常用于在每個測試方法執(zhí)行之前準(zhǔn)備一些通用的數(shù)據(jù)或環(huán)境
@BeforeEach void init() { System.out.println("Running setup before each test..."); }
4、@AfterEach
- 用于在
每個測試方法之后
執(zhí)行的清理代碼 - 常用于在每個測試方法之后恢復(fù)原狀或清理一些資源
@AfterEach void cleanup() { System.out.println("Running cleanup after each test..."); }
5、@DisplayName
用于為測試類或測試方法提供一個更具可讀性或說明性的名稱
,便于在測試報告中展示
6、@Disabled
當(dāng)執(zhí)行所有
測試方法時候,@Disabled注解的方法不會執(zhí)行
7、@RepeatedTest
用于多次重復(fù)執(zhí)行
某個測試,可以指定重復(fù)次數(shù)
四、常用斷言
斷言(Assertions)在單元測試中用于驗證程序行為是否符合預(yù)期
。JUnit 提供了一組用于編寫斷言的方法,斷言的使用可以幫助判斷測試是否通過。類名org.junit.jupiter.api.Assertions
1、assertEquals(expected, actual)
- 驗證兩個對象
是否相等
- 可以用于
各種數(shù)據(jù)類型
,包括基本類型、對象等
assertEquals(5, 2 + 3); assertEquals("Hello", greetingService.getGreeting());
2、assertNotEquals(expected, actual)
驗證兩個對象是否不相等
assertNotEquals(10, 2 + 3);
3、assertTrue(condition)
驗證條件為true
assertTrue(5 > 3);
4、assertFalse(condition)
驗證條件為false
assertFalse(3 > 5);
5、assertNull(actual)
驗證對象是否為null
String str = null; assertNull(str);
6、assertNotNull(actual)
驗證對象是否不為null
String str = "Hello"; assertNotNull(str);
7、assertArrayEquals(expected, actual)
驗證兩個數(shù)組是否相等
數(shù)組的長度
和元素的順序
都必須相同
int[] expected = {1, 2, 3}; int[] actual = {1, 2, 3}; assertArrayEquals(expected, actual);
8、assertSame(expected, actual)
驗證兩個對象引用是否指向同一個對象
(即是同一個對象的引用)
Object obj = new Object(); assertSame(obj, obj);
9、assertNotSame(expected, actual)
驗證兩個對象引用是否不指向同一個對象
Object obj1 = new Object(); Object obj2 = new Object(); assertNotSame(obj1, obj2);
10、fail(message)
強制使測試失敗
通常用于標(biāo)記不應(yīng)該被執(zhí)行的代碼路徑
if (someCondition) { fail("Unexpected condition occurred"); }
11、帶有消息參數(shù)的斷言
JUnit的斷言方法通常有一個變體,可以帶有一個額外的字符串參數(shù)
,用于在測試失敗時提供錯誤消息
,幫助更快找到問題。
五、@MockBean注入
1、@MockBean的主要作用
@MockBean會將應(yīng)用上下文中的某個Bean替換為模擬的Bean(Mock 對象)
@MockBean自動與Spring上下文集成,允許模擬的Bean被注入到需要它的其他Bean中
2、@MockBean的典型用法(模擬數(shù)據(jù)層)
假設(shè)我們有一個UserService依賴于UserRepository,而我們在測試中不想使用真實的UserRepository,而是使用模擬對象
。
@Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public User getUserById(Long id) { return userRepository.findById(id); } }
- 使用
@MockBean
來模擬UserRepository given
方法模擬
了userRepository.findById(1L)方法的調(diào)用
,并定義了當(dāng)該方法被調(diào)用時,willReturn
表示返回一個mockUser對象
import org.junit.jupiter.api.Test; import org.mockito.BDDMockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.BDDMockito.given; @SpringBootTest public class UserServiceTest { @Autowired private UserService userService; // 模擬 UserRepository,替換掉應(yīng)用上下文中的實際 Bean @MockBean private UserRepository userRepository; @Test void testGetUserById() { // 創(chuàng)建模擬數(shù)據(jù) User mockUser = new User(1L, "John Doe"); // 使用 Mockito 的 BDD 風(fēng)格方法設(shè)置模擬行為 given(userRepository.findById(1L)).willReturn(mockUser); // 調(diào)用服務(wù)層方法,驗證返回值是否符合預(yù)期 User result = userService.getUserById(1L); assertEquals("John Doe", result.getName()); } }
到此這篇關(guān)于SpringBoot 集成JUnit5的文章就介紹到這了,更多相關(guān)SpringBoot 集成JUnit5內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java通過復(fù)選框控件數(shù)組實現(xiàn)添加多個復(fù)選框控件示例分享
編寫程序,通過復(fù)選框控件數(shù)組事先選擇用戶愛好信息的復(fù)選框,在該程序中,要求界面中的復(fù)選框數(shù)量可以根據(jù)指定復(fù)選框名稱的字符串?dāng)?shù)組的長度來自動調(diào)節(jié)2014-02-02spring?boot配置dubbo方式(properties)
這篇文章主要介紹了spring?boot配置dubbo方式(properties),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01Springboot 如何指定獲取出 yml文件里面的配置值
這篇文章主要介紹了Springboot 如何指定獲取出 yml文件里面的配置值操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07