總結(jié)Junit4,Junit5,Jupiter之間的聯(lián)系
Junit5
目前Java領(lǐng)域內(nèi)最為流行的單元測(cè)試框架 ------ JUnit
Junit的最新版本JUnit5于2017年發(fā)布。
Junit 5 = Junit Platform + Junit Jupiter + Junit Vintage
Junit Platform: Junit Platform是在JVM上啟動(dòng)測(cè)試框架的基礎(chǔ),不僅支持Junit自制的測(cè)試引擎,其他測(cè)試引擎也都可以接入。
Junit Jupiter: Junit Jupiter提供了JUnit5的新的編程模型,是JUnit5新特性的核心。內(nèi)部 包含了一個(gè)測(cè)試引擎,用于在Junit Platform上運(yùn)行。
Junit Vintage: 由于JUnit已經(jīng)發(fā)展多年,為了照顧老的項(xiàng)目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的測(cè)試引擎。
Dependency
Junit4
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
當(dāng)前dependency會(huì)引入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>
當(dāng)前dependency會(huì)引入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>
當(dāng)前dependency會(huì)引入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 | 說(shuō)明 |
|---|---|---|
| @Test | @Test | 被注解的方法是一個(gè)測(cè)試方法。與 JUnit 4 相同。 |
| @BeforeAll | @BeforeClass | 被注解的(靜態(tài))方法將在當(dāng)前類中的所有 @Test 方法前執(zhí)行一次。 |
| @BeforeEach | @Before | 被注解的方法將在當(dāng)前類中的每個(gè) @Test 方法前執(zhí)行。 |
| @AfterEach | @After | 被注解的方法將在當(dāng)前類中的每個(gè) @Test 方法后執(zhí)行。 |
| @AfterAll | @AfterClass | 被注解的(靜態(tài))方法將在當(dāng)前類中的所有 @Test 方法后執(zhí)行一次。 |
| @Disabled | @Ignore | 被注解的方法不會(huì)執(zhí)行(將被跳過(guò)),但會(huì)報(bào)告為已執(zhí)行 |
Junit4中的@Test是import org.junit.Test;
Jupiter中的@Test是import org.junit.jupiter.api.Test;
斷言
在Junit4和Junit5中均有標(biāo)準(zhǔn)斷言
| 斷言方法 | 說(shuō)明 |
|---|---|
| assertEquals(expected, actual) | 如果 expected 不等于 actual ,則斷言失敗。 |
| assertFalse(booleanExpression) | 如果 booleanExpression 不是 false ,則斷言失敗。 |
| assertNull(actual) | 如果 actual 不是 null ,則斷言失敗。 |
| assertNotNull(actual) | 如果 actual 是 null ,則斷言失敗。 |
| assertTrue(booleanExpression) | 如果 booleanExpression 不是 true ,則斷言失敗。 |
Junit4中任何斷言失敗,測(cè)試就會(huì)在該位置失敗,意味著不會(huì)執(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);
}
如果希望所有 斷言都會(huì)執(zhí)行,即使一個(gè)或多個(gè)斷言失敗也是如此,該怎么做呢?
可以使用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注釋。這個(gè)名稱在生成報(bào)告時(shí)使用,這使得描述測(cè)試的目的和追蹤失敗更容易
運(yùn)行單元測(cè)試后,點(diǎn)擊如下位置則可生成html報(bào)告
Student生成的單元測(cè)試報(bào)告為T(mén)est Results - StudentTest.html
StudentJupiterTest生成的單元測(cè)試報(bào)告為T(mén)est Results - StudentJupiterTest.html
校驗(yàn)異常
Junit4提供了@Test(expected = Exception.class)的方式來(lái)校驗(yàn)異常,但這種方式的缺點(diǎn)是,當(dāng)兩個(gè)不同的業(yè)務(wù)拋出相同的業(yè)務(wù)異常,
而僅僅message不同時(shí)則無(wú)法精準(zhǔn)的校驗(yàn)。
@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();
}
當(dāng)然也可以通過(guò)捕獲異常的方式,再判斷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提供了新的校驗(yàn)方式,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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中關(guān)于Null的9個(gè)解釋(Java Null詳解)
這篇文章主要介紹了Java中關(guān)于Null的9個(gè)解釋(Java Null詳解),本文詳細(xì)講解了Java中Null的9個(gè)相關(guān)知識(shí),需要的朋友可以參考下2015-01-01
Java實(shí)戰(zhàn)之飛翔的小鳥(niǎo)小游戲
這篇文章主要介紹了Java實(shí)戰(zhàn)之飛翔的小鳥(niǎo)小游戲,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
關(guān)于MyBatis結(jié)果映射的實(shí)例總結(jié)
結(jié)果集映射主要是為了解決屬性名和類型名不一致的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于MyBatis結(jié)果映射的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
javaWEB實(shí)現(xiàn)相冊(cè)管理的簡(jiǎn)單功能
這篇文章主要介紹了javaWEB實(shí)現(xiàn)相冊(cè)管理的簡(jiǎn)單功能,包括圖片的上傳、統(tǒng)一瀏覽、單個(gè)下載、單個(gè)刪除,還有一個(gè)功能只能刪除自己上傳的文件,感興趣的小伙伴們可以參考一下2015-11-11
Java抓包工具fiddler實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)
Fiddler是一個(gè)http協(xié)議調(diào)試代理工具,本文主要介紹了Java抓包工具fiddler實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

