SpringBoot 集成JUnit5的詳細(xì)操作過程
一、JUnit5介紹
JUnit5是一個(gè)功能強(qiáng)大的單元測試框架,是JUnit系列的最新版本,它引入了多個(gè)改進(jìn)和新特性,旨在為Java應(yīng)用程序提供靈活且模塊化的測試支持。
1、JUnit5組成結(jié)構(gòu)
- JUnit Platform:這個(gè)模塊提供了測試的
啟動(dòng)API和運(yùn)行環(huán)境,是整個(gè)JUnit5框架的核心。它支持在不同的環(huán)境中運(yùn)行測試,如命令行、IDE或構(gòu)建工具(例如Maven、Gradle) - JUnit Jupiter:這個(gè)模塊包含了JUnit5的
新測試編寫和擴(kuò)展模型,提供了全新的注解、測試方法和擴(kuò)展機(jī)制 - JUnit Vintage:為了支持舊版本的JUnit測試(JUnit3和JUnit4),JUnit5提供了Vintage模塊。這個(gè)模塊允許開發(fā)者繼續(xù)運(yùn)行以前版本的測試,同時(shí)過渡到JUnit5
2、什么是單元測試
- 單元測試是指對軟件中的
最小可測試單元進(jìn)行檢查和驗(yà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的,因?yàn)镴Unit4通過反射機(jī)制要求訪問公共方法 - 而
JUnit5則沒有這種要求,測試類和方法的可見性設(shè)為包級(默認(rèn))足夠 JUnit 5 框架執(zhí)行測試- 因?yàn)?JUnit 5 本質(zhì)上是在測試框架內(nèi)部執(zhí)行這些測試
- 包級別的可見性允許同一包內(nèi)的類訪問測試類,而不需要將其暴露為 public
3、@SpringBootTest工作原理
它會啟動(dòng)整個(gè)Spring容器,加載應(yīng)用程序的所有Bean,并創(chuàng)建一個(gè)完整的應(yīng)用上下文。這是集成測試,因?yàn)樗M了應(yīng)用程序的真實(shí)運(yùn)行環(huán)境。
查找主配置類的兩種方式:
包掃描:默認(rèn)情況下,@SpringBootTest 會從測試類所在的包開始,向上查找同一包或父包中帶有 @SpringBootApplication或@SpringBootConfiguration注解的類,作為應(yīng)用的配置類

顯式指定:如果 @SpringBootTest 無法自動(dòng)找到 @SpringBootApplication 注解的配置類,或者你希望手動(dòng)指定配置類,你可以在@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í)行完成后運(yùn)行的靜態(tài)清理代碼 - 通常用于釋放資源、關(guān)閉連接等操作
- 被注解的方法必須是
static
@AfterAll
static void tearDown() {
System.out.println("Running teardown after all tests...");
}3、@BeforeEach
- 用于在
每個(gè)測試方法之前執(zhí)行的初始化代碼 - 常用于在每個(gè)測試方法執(zhí)行之前準(zhǔn)備一些通用的數(shù)據(jù)或環(huán)境
@BeforeEach
void init() {
System.out.println("Running setup before each test...");
}4、@AfterEach
- 用于在
每個(gè)測試方法之后執(zhí)行的清理代碼 - 常用于在每個(gè)測試方法之后恢復(fù)原狀或清理一些資源
@AfterEach
void cleanup() {
System.out.println("Running cleanup after each test...");
}5、@DisplayName
用于為測試類或測試方法提供一個(gè)更具可讀性或說明性的名稱,便于在測試報(bào)告中展示

6、@Disabled
當(dāng)執(zhí)行所有測試方法時(shí)候,@Disabled注解的方法不會執(zhí)行

7、@RepeatedTest
用于多次重復(fù)執(zhí)行某個(gè)測試,可以指定重復(fù)次數(shù)

四、常用斷言
斷言(Assertions)在單元測試中用于驗(yàn)證程序行為是否符合預(yù)期。JUnit 提供了一組用于編寫斷言的方法,斷言的使用可以幫助判斷測試是否通過。類名org.junit.jupiter.api.Assertions
1、assertEquals(expected, actual)
- 驗(yàn)證兩個(gè)對象
是否相等 - 可以用于
各種數(shù)據(jù)類型,包括基本類型、對象等
assertEquals(5, 2 + 3);
assertEquals("Hello", greetingService.getGreeting());2、assertNotEquals(expected, actual)
驗(yàn)證兩個(gè)對象是否不相等
assertNotEquals(10, 2 + 3);
3、assertTrue(condition)
驗(yàn)證條件為true
assertTrue(5 > 3);
4、assertFalse(condition)
驗(yàn)證條件為false
assertFalse(3 > 5);
5、assertNull(actual)
驗(yàn)證對象是否為null
String str = null; assertNull(str);
6、assertNotNull(actual)
驗(yàn)證對象是否不為null
String str = "Hello"; assertNotNull(str);
7、assertArrayEquals(expected, actual)
驗(yàn)證兩個(gè)數(shù)組是否相等
數(shù)組的長度和元素的順序都必須相同
int[] expected = {1, 2, 3};
int[] actual = {1, 2, 3};
assertArrayEquals(expected, actual);8、assertSame(expected, actual)
驗(yàn)證兩個(gè)對象引用是否指向同一個(gè)對象(即是同一個(gè)對象的引用)
Object obj = new Object(); assertSame(obj, obj);
9、assertNotSame(expected, actual)
驗(yàn)證兩個(gè)對象引用是否不指向同一個(gè)對象
Object obj1 = new Object(); Object obj2 = new Object(); assertNotSame(obj1, obj2);
10、fail(message)
強(qiáng)制使測試失敗
通常用于標(biāo)記不應(yīng)該被執(zhí)行的代碼路徑
if (someCondition) {
fail("Unexpected condition occurred");
}11、帶有消息參數(shù)的斷言
JUnit的斷言方法通常有一個(gè)變體,可以帶有一個(gè)額外的字符串參數(shù),用于在測試失敗時(shí)提供錯(cuò)誤消息,幫助更快找到問題。

五、@MockBean注入
1、@MockBean的主要作用
@MockBean會將應(yīng)用上下文中的某個(gè)Bean替換為模擬的Bean(Mock 對象)
@MockBean自動(dòng)與Spring上下文集成,允許模擬的Bean被注入到需要它的其他Bean中
2、@MockBean的典型用法(模擬數(shù)據(jù)層)
假設(shè)我們有一個(gè)UserService依賴于UserRepository,而我們在測試中不想使用真實(shí)的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)用時(shí),willReturn表示返回一個(gè)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)用上下文中的實(shí)際 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àn)證返回值是否符合預(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ù)組實(shí)現(xiàn)添加多個(gè)復(fù)選框控件示例分享
編寫程序,通過復(fù)選框控件數(shù)組事先選擇用戶愛好信息的復(fù)選框,在該程序中,要求界面中的復(fù)選框數(shù)量可以根據(jù)指定復(fù)選框名稱的字符串?dāng)?shù)組的長度來自動(dòng)調(diào)節(jié)2014-02-02
spring?boot配置dubbo方式(properties)
這篇文章主要介紹了spring?boot配置dubbo方式(properties),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Springboot 如何指定獲取出 yml文件里面的配置值
這篇文章主要介紹了Springboot 如何指定獲取出 yml文件里面的配置值操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

