Springboot集成JUnit5優(yōu)雅進(jìn)行單元測(cè)試的示例
為什么使用JUnit5
- JUnit4被廣泛使用,但是許多場(chǎng)景下使用起來(lái)語(yǔ)法較為繁瑣,JUnit5中支持lambda表達(dá)式,語(yǔ)法簡(jiǎn)單且代碼不冗余。
- JUnit5易擴(kuò)展,包容性強(qiáng),可以接入其他的測(cè)試引擎。
- 功能更強(qiáng)大提供了新的斷言機(jī)制、參數(shù)化測(cè)試、重復(fù)性測(cè)試等新功能。
- ps:開(kāi)發(fā)人員為什么還要測(cè)試,單測(cè)寫(xiě)這么規(guī)范有必要嗎?其實(shí)單測(cè)是開(kāi)發(fā)人員必備技能,只不過(guò)很多開(kāi)發(fā)人員開(kāi)發(fā)任務(wù)太重導(dǎo)致調(diào)試完就不管了,沒(méi)有系統(tǒng)化得單元測(cè)試,單元測(cè)試在系統(tǒng)重構(gòu)時(shí)能發(fā)揮巨大的作用,可以在重構(gòu)后快速測(cè)試新的接口是否與重構(gòu)前有出入。
簡(jiǎn)介

如圖,JUnit5結(jié)構(gòu)如下:
- JUnit Platform: 這是Junit提供的平臺(tái)功能模塊,通過(guò)它,其它的測(cè)試引擎都可以接入Junit實(shí)現(xiàn)接口和執(zhí)行。
- JUnit JUpiter:這是JUnit5的核心,是一個(gè)基于JUnit Platform的引擎實(shí)現(xiàn),它包含許多豐富的新特性來(lái)使得自動(dòng)化測(cè)試更加方便和強(qiáng)大。
- JUnit Vintage:這個(gè)模塊是兼容JUnit3、JUnit4版本的測(cè)試引擎,使得舊版本的自動(dòng)化測(cè)試也可以在JUnit5下正常運(yùn)行。
依賴(lài)引入
我們以SpringBoot2.3.1為例,引入如下依賴(lài),防止使用舊的junit4相關(guān)接口我們將其依賴(lài)排除。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
常用注解
- @BeforeEach:在每個(gè)單元測(cè)試方法執(zhí)行前都執(zhí)行一遍
- @BeforeAll:在每個(gè)單元測(cè)試方法執(zhí)行前執(zhí)行一遍(只執(zhí)行一次)
- @DisplayName("商品入庫(kù)測(cè)試"):用于指定單元測(cè)試的名稱(chēng)
- @Disabled:當(dāng)前單元測(cè)試置為無(wú)效,即單元測(cè)試時(shí)跳過(guò)該測(cè)試
- @RepeatedTest(n):重復(fù)性測(cè)試,即執(zhí)行n次
- @ParameterizedTest:參數(shù)化測(cè)試,
- @ValueSource(ints = {1, 2, 3}):參數(shù)化測(cè)試提供數(shù)據(jù)
斷言
JUnit Jupiter提供了強(qiáng)大的斷言方法用以驗(yàn)證結(jié)果,在使用時(shí)需要借助java8的新特性lambda表達(dá)式,均是來(lái)自org.junit.jupiter.api.Assertions包的static方法。
assertTrue與assertFalse用來(lái)判斷條件是否為true或false
@Test
@DisplayName("測(cè)試斷言equals")
void testEquals() {
assertTrue(3 < 4);
}
assertNull與assertNotNull用來(lái)判斷條件是否為·null
@Test
@DisplayName("測(cè)試斷言NotNull")
void testNotNull() {
assertNotNull(new Object());
}
assertThrows用來(lái)判斷執(zhí)行拋出的異常是否符合預(yù)期,并可以使用異常類(lèi)型接收返回值進(jìn)行其他操作
@Test
@DisplayName("測(cè)試斷言拋異常")
void testThrows() {
ArithmeticException arithExcep = assertThrows(ArithmeticException.class, () -> {
int m = 5/0;
});
assertEquals("/ by zero", arithExcep.getMessage());
}
assertTimeout用來(lái)判斷執(zhí)行過(guò)程是否超時(shí)
@Test
@DisplayName("測(cè)試斷言超時(shí)")
void testTimeOut() {
String actualResult = assertTimeout(ofSeconds(2), () -> {
Thread.sleep(1000);
return "a result";
});
System.out.println(actualResult);
}
assertAll是組合斷言,當(dāng)它內(nèi)部所有斷言正確執(zhí)行完才算通過(guò)
@Test
@DisplayName("測(cè)試組合斷言")
void testAll() {
assertAll("測(cè)試item商品下單",
() -> {
//模擬用戶(hù)余額扣減
assertTrue(1 < 2, "余額不足");
},
() -> {
//模擬item數(shù)據(jù)庫(kù)扣減庫(kù)存
assertTrue(3 < 4);
},
() -> {
//模擬交易流水落庫(kù)
assertNotNull(new Object());
}
);
}
重復(fù)性測(cè)試
在許多場(chǎng)景中我們需要對(duì)同一個(gè)接口方法進(jìn)行重復(fù)測(cè)試,例如對(duì)冪等性接口的測(cè)試。
JUnit Jupiter通過(guò)使用@RepeatedTest(n)指定需要重復(fù)的次數(shù)
@RepeatedTest(3)
@DisplayName("重復(fù)測(cè)試")
void repeatedTest() {
System.out.println("調(diào)用");
}

參數(shù)化測(cè)試
參數(shù)化測(cè)試可以按照多個(gè)參數(shù)分別運(yùn)行多次單元測(cè)試這里有點(diǎn)類(lèi)似于重復(fù)性測(cè)試,只不過(guò)每次運(yùn)行傳入的參數(shù)不用。需要使用到@ParameterizedTest,同時(shí)也需要@ValueSource提供一組數(shù)據(jù),它支持八種基本類(lèi)型以及String和自定義對(duì)象類(lèi)型,使用極其方便。
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@DisplayName("參數(shù)化測(cè)試")
void paramTest(int a) {
assertTrue(a > 0 && a < 4);
}
內(nèi)嵌測(cè)試
JUnit5提供了嵌套單元測(cè)試的功能,可以更好展示測(cè)試類(lèi)之間的業(yè)務(wù)邏輯關(guān)系,我們通常是一個(gè)業(yè)務(wù)對(duì)應(yīng)一個(gè)測(cè)試類(lèi),有業(yè)務(wù)關(guān)系的類(lèi)其實(shí)可以寫(xiě)在一起。這樣有利于進(jìn)行測(cè)試。而且內(nèi)聯(lián)的寫(xiě)法可以大大減少不必要的類(lèi),精簡(jiǎn)項(xiàng)目,防止類(lèi)爆炸等一系列問(wèn)題。
@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("Junit5單元測(cè)試")
public class MockTest {
//....
@Nested
@DisplayName("內(nèi)嵌訂單測(cè)試")
class OrderTestClas {
@Test
@DisplayName("取消訂單")
void cancelOrder() {
int status = -1;
System.out.println("取消訂單成功,訂單狀態(tài)為:"+status);
}
}
}
以上就是Springboot集成JUnit5優(yōu)雅進(jìn)行單元測(cè)試的示例的詳細(xì)內(nèi)容,更多關(guān)于Springboot 單元測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Boot+Mybatis+Pagehelper分頁(yè)實(shí)現(xiàn)
本篇文章主要講述的是Spring Boot+Mybatis+Pagehelper分頁(yè)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
SpringBoot與其他框架集成時(shí)的版本沖突問(wèn)題排查與解決全流程
解決 Spring Boot 與其他框架集成的版本沖突,核心思路是利用 Spring Boot 的版本仲裁機(jī)制鎖定依賴(lài)版本,顯式控制沖突依賴(lài),排查沖突根源,以下是具體步驟、方法和實(shí)戰(zhàn)案例,覆蓋從預(yù)防到排查再到解決的全流程,需要的朋友可以參考下2025-11-11
SpringBoot中全局異常處理的5種實(shí)現(xiàn)方式小結(jié)
在實(shí)際開(kāi)發(fā)中,異常處理是一個(gè)非常重要的環(huán)節(jié),合理的異常處理機(jī)制不僅能提高系統(tǒng)的健壯性,還能大大提升用戶(hù)體驗(yàn),下面我們就來(lái)看看SpringBoot中全局異常處理的5種實(shí)現(xiàn)方式吧2025-03-03
完整B樹(shù)算法Java實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了完整的B樹(shù)算法Java實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Java 基礎(chǔ)--Arrays工具類(lèi)詳解
這篇文章主要介紹了Java Arrays工具類(lèi)用法,結(jié)合實(shí)例形式分析了java Arrays工具類(lèi)針對(duì)數(shù)組元素修改、復(fù)制、排序等操作使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2021-09-09
Spring?Boot?如何生成微信小程序短連接及發(fā)送短信在短信中打開(kāi)小程序操作
最近遇到這樣的需求需要發(fā)送短信,通過(guò)短信中的短連接打開(kāi)小程序操作,下面小編給大家分享Spring?Boot?如何生成微信小程序短連接發(fā)送短信在短信中打開(kāi)小程序操作,感興趣的朋友跟隨小編一起看看吧2024-03-03
java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法
今天小編就為大家分享一篇java 正則表達(dá)式獲取兩個(gè)字符中間的字符串方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Spring事務(wù)的傳播機(jī)制使用及說(shuō)明
本文介紹了Spring事務(wù)的傳播機(jī)制,包括事務(wù)的傳播行為、傳播級(jí)別以及如何在方法中使用這些傳播級(jí)別,通過(guò)一個(gè)例子說(shuō)明了不同傳播級(jí)別的效果2025-11-11

