org.junit.vintage
junit-vintage-engine
test
org.hamcrest
hamcrest-core
org.springframework.boot
spring-boot-starter-test
test
現(xiàn)在版本:
@SpringBootTest
class Boot05WebAdminApplicationTests {
@Test
void contextLoads() {
}
}
以前:
@SpringBootTest + @RunWith(SpringRunner.class)
SpringBoot整合Junit以后。
編寫測試方法:@Test標注(注意需要使用junit5版本的注解)
Junit類具有Spring的功能,@Autowired、比如 @Transactional 標注測試方法,測試完成后自動回滾
JUnit5常用注解
=========================================================================
@Test :表示方法是測試方法。但是與JUnit4的@Test不同,他的職責非常單一不能聲明任何屬性,拓展的測試將會由Jupiter提供額外測試
@ParameterizedTest :表示方法是參數(shù)化測試,下方會有詳細介紹
@RepeatedTest :表示方法可重復(fù)執(zhí)行,指定測試次數(shù),會重復(fù)指定次數(shù)
@DisplayName :為測試類或者測試方法設(shè)置展示名稱
@BeforeEach :表示在每個單元測試之前執(zhí)行
@AfterEach :表示在每個單元測試之后執(zhí)行
@BeforeAll :表示在所有單元測試之前執(zhí)行
@AfterAll :表示在所有單元測試之后執(zhí)行
標注這上面兩個注解的方法必須是static
@Tag :表示單元測試類別,類似于JUnit4中的@Categories
@Disabled :表示測試類或測試方法不執(zhí)行,類似于JUnit4中的@Ignore
@Timeout :表示測試方法運行如果超過了指定時間將會返回錯誤
@ExtendWith :為測試類或測試方法提供擴展類引用
常用注解使用演示
=======================================================================
//@RunWith
/*
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@ExtendWith({SpringExtension.class})===>替代runwith
*/
@SpringBootTest //使用spring的測試驅(qū)動進行測試,這樣就可以使用SpringBoot中的容器功能了
@DisplayName(“自定義測試類”)
public class Test
{
@DisplayName(“自定義測試方法”)
@org.junit.jupiter.api.Test
public void test1()
{
System.out.println(“測試方法1運行”);
}
@Disabled //該測試方法不執(zhí)行
@org.junit.jupiter.api.Test
public void test2()
{
System.out.println(“測試方法2運行”);
}
@RepeatedTest(5)//當前測試方法一旦運行就執(zhí)行5次
@org.junit.jupiter.api.Test
public void test3()
{
System.out.println(“測試方法3運行”);
}
//規(guī)定方法的超時時間,超出指定時間就會拋出異常
@org.junit.jupiter.api.Test
@Timeout(value = 1,unit = TimeUnit.SECONDS)//指定單位,這里是秒
public void test4() throws InterruptedException {
Thread.sleep(3000);
System.out.println(“測試方法4運行”);
}
@BeforeEach
public void testBeforeEach()
{
System.out.println(“測試方法即將開始”);
}
@AfterEach
public void testAfterEachEach()
{
System.out.println(“測試方法結(jié)束”);
}
@BeforeAll
static public void testBeforeAll()
{
System.out.println(“所有測試方法即將開始”);
}
@AfterAll
static public void testAfterEachAll()
{
System.out.println(“所有測試方法結(jié)束”);
}
}
斷言機制(assertions)
===============================================================================
斷言(assertions)是測試方法中的核心部分,用來對測試需要滿足的條件進行驗證。這些斷言方法都是 org.junit.jupiter.api.Assertions 的靜態(tài)方法。JUnit 5 內(nèi)置的斷言可以分成如下幾個類別:
-
檢查業(yè)務(wù)邏輯返回的數(shù)據(jù)是否合理。
-
所有的測試運行結(jié)束以后,會有一個詳細的測試報告;
1、簡單斷言
用來對單個值進行簡單的驗證。如:
前面的斷言失敗,后面的斷言不會執(zhí)行
@Test
@DisplayName(“simple assertion”)
public void simple() {
assertEquals(3, 1 + 2, “simple math”);
assertNotEquals(3, 1 + 1);
assertNotSame(new Object(), new Object());
Object obj = new Object();
assertSame(obj, obj);
assertFalse(1 > 2);
assertTrue(1 < 2);
assertNull(null);
assertNotNull(new Object());
}
2、數(shù)組斷言
通過 assertArrayEquals 方法來判斷兩個對象或原始類型的數(shù)組是否相等
是邏輯相等,也就是equals,不是地址相等,即==對于數(shù)組就是數(shù)組元素一致
@Test
@DisplayName(“array assertion”)
public void array() {
assertArrayEquals(new int[]{1, 2}, new int[] {1, 2},“數(shù)組內(nèi)容不相等”);
}
3、組合斷言
assertAll 方法接受多個 org.junit.jupiter.api.Executable 函數(shù)式接口的實例作為要驗證的斷言,可以通過 lambda 表達式很容易的提供這些斷言
全部斷言需要成功,才會執(zhí)行下面的代碼
@Test
@DisplayName(“assert all”)
public void all() {
assertAll(“Math”,
() -> assertEquals(2, 1 + 1),
() -> assertTrue(1 > 0)
);
}
4、異常斷言
在JUnit4時期,想要測試方法的異常情況時,需要用@Rule注解的ExpectedException變量還是比較麻煩的。而JUnit5提供了一種新的斷言方式Assertions.assertThrows() ,配合函數(shù)式編程就可以進行使用
第一個參數(shù)是預(yù)期出現(xiàn)的異常類型,第二個參數(shù)是Executable 接口,第三個參數(shù)是不符合第一個異常時拋出的信息
斷定業(yè)務(wù)邏輯一定會出現(xiàn)異常,否則會拋出異常
@Test
@DisplayName(“異常測試”)
public void exceptionTest() {
ArithmeticException exception = Assertions.assertThrows(
//扔出斷言異常
ArithmeticException.class, () -> System.out.println(1 % 0));
}
5、超時斷言
Junit5還提供了Assertions.assertTimeout() 為測試方法設(shè)置了超時時間
@Test
@DisplayName(“超時測試”)
public void timeoutTest() {
//如果測試方法時間超過1s將會異常
Assertions.assertTimeout(Duration.ofMillis(1000), () -> Thread.sleep(500));
}
6、快速失敗
通過 fail 方法直接使得測試失敗
@Test
@DisplayName(“fail”)
public void shouldFail() {
fail(“This should fail”);
}
4、前置條件(assumptions)
JUnit 5 中的前置條件(assumptions【假設(shè)】)類似于斷言,不同之處在于不滿足的斷言會使得測試方法失敗,而不滿足的前置條件只會使得測試方法的執(zhí)行終止。前置條件可以看成是測試方法執(zhí)行的前提,當該前提不滿足時,就沒有繼續(xù)執(zhí)行的必要。
和@disabled一樣在測試報告中表現(xiàn)為skiped,注意和上面的包區(qū)分,這些方法都是assumptions下面的,上面是assertions下面的。
@DisplayName(“前置條件”)
public class Test {
private final String environment = “DEV”;
@org.junit.jupiter.api.Test
@DisplayName(“simple”)
public void simpleAssume() {
assumeTrue(Objects.equals(this.environment, “DEV1”),“兩個字符串不相等”);
assumeFalse(() -> Objects.equals(this.environment, “PROD”));
}
@org.junit.jupiter.api.Test
@DisplayName(“assume then do”)
public void assumeThenDo() {
//如果假設(shè)成功了,要怎么辦
assumingThat(
Objects.equals(this.environment, “DEV”),
() -> System.out.println(“In DEV”)
);
}
}
assumeTrue 和 assumFalse 確保給定的條件為 true 或 false,不滿足條件會使得測試執(zhí)行終止。assumingThat 的參數(shù)是表示條件的布爾值和對應(yīng)的 Executable 接口的實現(xiàn)對象。只有條件滿足時,Executable 對象才會被執(zhí)行;當條件不滿足時,測試執(zhí)行并不會終止。
5、嵌套測試
JUnit 5 可以通過 Java 中的內(nèi)部類和@Nested 注解實現(xiàn)嵌套測試,從而可以更好的把相關(guān)的測試方法組織在一起。在內(nèi)部類中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的層次沒有限制。
內(nèi)層的test可以驅(qū)動外層的Before(After)Each/All之類的方法提前/之后運行,外層的不能驅(qū)動內(nèi)層的Before(After)Each/All之類的方法
@DisplayName(“前置條件”)
public class Test
{
Stack stack;
@org.junit.jupiter.api.Test
@DisplayName(“is instantiated with new Stack()”)
void isInstantiatedWithNew() {
new Stack<>();
}
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現(xiàn)在。
深知大多數(shù)Java工程師,想要提升技能,往往是自己摸索成長或者是報班學(xué)習(xí),但對于培訓(xùn)機構(gòu)動則幾千的學(xué)費,著實壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Java開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負擔。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學(xué)習(xí)提升的進階課程,基本涵蓋了95%以上Java開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且會持續(xù)更新!
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲取?。。▊渥ava獲?。?/strong>

寫在最后
很多人感嘆“學(xué)習(xí)無用”,實際上之所以產(chǎn)生無用論,是因為自己想要的與自己所學(xué)的匹配不上,這也就意味著自己學(xué)得遠遠不夠。無論是學(xué)習(xí)還是工作,都應(yīng)該有主動性,所以如果擁有大廠夢,那么就要自己努力去實現(xiàn)它。
最后祝愿各位身體健康,順利拿到心儀的offer!
由于文章的篇幅有限,所以這次的螞蟻金服和京東面試題答案整理在了PDF文檔里
《互聯(lián)網(wǎng)大廠面試真題解析、進階開發(fā)核心學(xué)習(xí)筆記、全套講解視頻、實戰(zhàn)項目源碼講義》點擊傳送門即可獲??!
深入學(xué)習(xí)提升的進階課程,基本涵蓋了95%以上Java開發(fā)知識點,真正體系化!**
由于文件比較大,這里只是將部分目錄截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且會持續(xù)更新!
如果你覺得這些內(nèi)容對你有幫助,可以掃碼獲?。。。▊渥ava獲?。?/strong>

寫在最后
很多人感嘆“學(xué)習(xí)無用”,實際上之所以產(chǎn)生無用論,是因為自己想要的與自己所學(xué)的匹配不上,這也就意味著自己學(xué)得遠遠不夠。無論是學(xué)習(xí)還是工作,都應(yīng)該有主動性,所以如果擁有大廠夢,那么就要自己努力去實現(xiàn)它。
最后祝愿各位身體健康,順利拿到心儀的offer!
由于文章的篇幅有限,所以這次的螞蟻金服和京東面試題答案整理在了PDF文檔里
[外鏈圖片轉(zhuǎn)存中…(img-hOm90Q92-1713310659917)]
[外鏈圖片轉(zhuǎn)存中…(img-xlEYIGAO-1713310659917)]文章來源:http://www.zghlxwxcb.cn/news/detail-861651.html
[外鏈圖片轉(zhuǎn)存中…(img-je8P7DIU-1713310659917)]
《互聯(lián)網(wǎng)大廠面試真題解析、進階開發(fā)核心學(xué)習(xí)筆記、全套講解視頻、實戰(zhàn)項目源碼講義》點擊傳送門即可獲??!文章來源地址http://www.zghlxwxcb.cn/news/detail-861651.html
到了這里,關(guān)于SpringBoot2---單元測試(Junit5)(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!