總結(jié)Junit4,Junit5,Jupiter之間的聯(lián)系
Junit5
目前Java領(lǐng)域內(nèi)最為流行的單元測試框架 ------ JUnit
Junit的最新版本JUnit5于2017年發(fā)布。
Junit 5 = Junit Platform + Junit Jupiter + Junit Vintage
Junit Platform: Junit Platform是在JVM上啟動測試框架的基礎(chǔ),不僅支持Junit自制的測試引擎,其他測試引擎也都可以接入。
Junit Jupiter: Junit Jupiter提供了JUnit5的新的編程模型,是JUnit5新特性的核心。內(nèi)部 包含了一個測試引擎,用于在Junit Platform上運行。
Junit Vintage: 由于JUnit已經(jīng)發(fā)展多年,為了照顧老的項目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的測試引擎。
Dependency
Junit4
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
當前dependency會引入junit:4.12和hamcrest-core:1.3的包
Junit vintage engine
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
當前dependency會引入unit:4.13, apiguardian-api:1.1.0, hamcrest-core:1.3, junit-platform-commons:1.6.2,
junit-platform-engine:1.6.2, junit-vintage-engine:5.6.2, opentest4j:1.2.0的包
Jupiter
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
當前dependency會引入apiguardian-api:1.1.0, junit-Jupiter-api:5.6.2, junit-platform-commons:1.6.2, opentest4j:1.2.0的包
Junit4和Junit5的注解區(qū)別
| Junit5 | Junit4 | 說明 |
|---|---|---|
| @Test | @Test | 被注解的方法是一個測試方法。與 JUnit 4 相同。 |
| @BeforeAll | @BeforeClass | 被注解的(靜態(tài))方法將在當前類中的所有 @Test 方法前執(zhí)行一次。 |
| @BeforeEach | @Before | 被注解的方法將在當前類中的每個 @Test 方法前執(zhí)行。 |
| @AfterEach | @After | 被注解的方法將在當前類中的每個 @Test 方法后執(zhí)行。 |
| @AfterAll | @AfterClass | 被注解的(靜態(tài))方法將在當前類中的所有 @Test 方法后執(zhí)行一次。 |
| @Disabled | @Ignore | 被注解的方法不會執(zhí)行(將被跳過),但會報告為已執(zhí)行 |
Junit4中的@Test是import org.junit.Test;
Jupiter中的@Test是import org.junit.jupiter.api.Test;
斷言
在Junit4和Junit5中均有標準斷言
| 斷言方法 | 說明 |
|---|---|
| assertEquals(expected, actual) | 如果 expected 不等于 actual ,則斷言失敗。 |
| assertFalse(booleanExpression) | 如果 booleanExpression 不是 false ,則斷言失敗。 |
| assertNull(actual) | 如果 actual 不是 null ,則斷言失敗。 |
| assertNotNull(actual) | 如果 actual 是 null ,則斷言失敗。 |
| assertTrue(booleanExpression) | 如果 booleanExpression 不是 true ,則斷言失敗。 |
Junit4中任何斷言失敗,測試就會在該位置失敗,意味著不會執(zhí)行任何其他斷言。例如StudentTest中的should_test_every_test。
@Test
public void should_test_every_test() {
//given when
int expected = 6;
int actual = 10 - 4;
Object nullValue = null;
//then
assertEquals(expected, actual);
assertFalse(true);
assertNull(nullValue);
assertTrue(false);
}
如果希望所有 斷言都會執(zhí)行,即使一個或多個斷言失敗也是如此,該怎么做呢?
可以使用Jupiter中提供的aseertAll方法
@Test
@DisplayName("test assertAll")
void should_test_every_test() {
//given when
int expected = 4;
int actual = 2 + 2;
Object nullValue = null;
//then
assertAll(
"Assert All of these",
() -> assertEquals(expected, actual),
() -> assertFalse(nullValue == null),
() -> assertNull(nullValue),
() -> assertNotNull("Hello Word!"),
() -> assertTrue(nullValue != null));
}
@DisplayName
可以在類和方法中添加@DisplayName注釋。這個名稱在生成報告時使用,這使得描述測試的目的和追蹤失敗更容易
運行單元測試后,點擊如下位置則可生成html報告
Student生成的單元測試報告為Test Results - StudentTest.html
StudentJupiterTest生成的單元測試報告為Test Results - StudentJupiterTest.html
校驗異常
Junit4提供了@Test(expected = Exception.class)的方式來校驗異常,但這種方式的缺點是,當兩個不同的業(yè)務(wù)拋出相同的業(yè)務(wù)異常,
而僅僅message不同時則無法精準的校驗。
@Test(expected = BusinessException.class)
public void should_throw_business_exception_when_student_name_length_more_than_10() {
//given when
StudentCommand.builder()
.name(RandomStringUtils.randomAlphanumeric(11))
.build();
}
@Test(expected = BusinessException.class)
public void should_throw_business_exception_when_student_description_length_more_than_20() {
//given when
StudentCommand.builder()
.name(RandomStringUtils.randomAlphanumeric(9))
.description(RandomStringUtils.randomAlphanumeric(21))
.build();
}
當然也可以通過捕獲異常的方式,再判斷message,但這種方式不太優(yōu)雅。
@Test
public void should_validate_message_when_student_name_length_more_than_10() {
//given when
try {
StudentCommand.builder()
.name(RandomStringUtils.randomAlphanumeric(11))
.build();
} catch (BusinessException e) {
assertEquals(e.getMessage(), "The length of student name exceed 10 chars.");
}
}
Jupiter提供了新的校驗方式,Assertions.assertThrows,在Junit的4.13的版本中,Asserts.assertThrows也提供了類似的功能
@Test
@DisplayName("It tests the length of student name should less than 10 chars")
void should_throw_business_exception_when_student_name_length_more_than_10() {
//given when
BusinessException businessException = Assertions.assertThrows(BusinessException.class, this::buildStudentName);
//then
assertEquals(businessException.getMessage(), "The length of student name exceed 10 chars.");
}
private void buildStudentName() {
StudentCommand.builder()
.name(RandomStringUtils.randomAlphanumeric(11))
.build();
}
@Test
@DisplayName("It tests the length of student description should less than 20 chars")
void should_throw_business_exception_when_student_description_length_more_than_20() {
//given when
BusinessException businessException = Assertions.assertThrows(BusinessException.class, this::buildStudentDescription);
//then
assertEquals(businessException.getMessage(), "The length of student name exceed 20 chars.");
}
private void buildStudentDescription() {
StudentCommand.builder()
.description(RandomStringUtils.randomAlphanumeric(21))
.build();
}
到此這篇關(guān)于總結(jié)Junit4,Junit5,Jupiter之間的聯(lián)系的文章就介紹到這了,更多相關(guān)Junit4,Junit5,Jupiter之間的聯(lián)系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Tomcat Cannot assign requested address: JVM_Bind 非端口占用沖突
這篇文章主要介紹了 Tomcat Cannot assign requested address: JVM_Bind 非端口占用沖突的相關(guān)資料,需要的朋友可以參考下2017-01-01
Dubbo無法訪問遠程Zookeeper已注冊服務(wù)的問題解決方案
今天小編就為大家分享一篇關(guān)于Dubbo無法訪問遠程Zookeeper已注冊服務(wù)的問題解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Mybatis批量更新對象數(shù)據(jù)的兩種實現(xiàn)方式
這篇文章主要介紹了Mybatis批量更新對象數(shù)據(jù)的兩種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Java Socket編程(五) 簡單的WEB服務(wù)器
Java Socket編程(五) 簡單的WEB服務(wù)器...2006-12-12
詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么
這篇文章主要介紹了詳解SpringBoot中添加@ResponseBody注解會發(fā)生什么,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
關(guān)于File與MultipartFile的用法概述
這篇文章主要介紹了關(guān)于File與MultipartFile的用法概述,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

