最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JUnit5相關內容簡介

 更新時間:2018年01月02日 08:44:00   作者:過了即是客  
這篇文章主要介紹了JUnit5相關內容簡介,具有一定借鑒價值,需要的朋友可以參考下

著名的Java單元測試框架Junit 4已經出來很長時間了,當時我發(fā)現JUnit 5已經處于測試版,就準備寫文章來介紹JUnit 5.不過因為還是測試版,所以有些地方還不太完善,我也有點懶沒有好好寫。這幾天突然想起這事了,在到官網上查看,發(fā)現就在9月10日,JUnit 5的正式版終于出來了!那么我就正好把文章重新好好寫寫,為大家介紹這個最新的JUnit框架。

框架結構

和JUnit 4相比,JUnit 5的結構非常清晰,為自定義插件、IDE測試執(zhí)行等擴展功能做了很好的支持。這一點從項目結構就可以看出來。

JUnit Platform

這一組的包名是org.junit.platform,從名字就可以看到,這一組的主要功能就是作為測試框架的基礎平臺。這個包下的模塊包含基礎API、執(zhí)行引擎及執(zhí)行器、基本的命令行執(zhí)行功能、命令行界面、Maven及Gradle的測試插件等最基本的功能。

JUnit Jupiter

Jupiter 是JUnit 5的代號,這個包下的模塊包含JUnit 5的主要功能。如果我們要使用JUnit 5,那么必然要包含這一組模塊。

JUnit Vintage

Vintage 是舊版本JUnit 的代號,這個包下的模塊可以讓我們在新的JUnit平臺上運行舊的JUnit 3 和 4 的測試。

導入類庫

在JUnit 5還在測試階段的時候,官方文檔上還有在Maven和Gradle中集成JUnit 5的例子。但是到了正式版,這一部分的內容消失了,僅僅留下兩個示例項目的鏈接,讓我們自己參考(復制粘貼)。

使用Maven

junit5-maven-consumer 是官方的Maven例子。本來我準備把相關的POM配置貼到這里,但是一看Maven的配置太長了,所以還是算了。如果有需求的話請自己查看這個項目的POM配置。

使用Gradle

如果用Gradle的話,那么這個問題就簡單多了。在junit5-gradle-consumer 示例項目中也有比較詳細的說明。

首先,Gradle默認不支持JUnit 5,,所以需要啟用JUnit Platform Gradle 插件來支持。

buildscript {
 repositories {
 mavenCentral()
 }
 dependencies {
 classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
 }
}
apply plugin: 'org.junit.platform.gradle.plugin'

然后是關于這個Gradle插件的配置。默認情況下所有的引擎和標簽都會被執(zhí)行。如果你想選擇只執(zhí)行某些引擎和標簽的測試,可以取消下面的注釋并按照你自己的需求進行修改。當然假如你沒有這些高級需求,可以把這一部分刪掉。

junitPlatform {
 // platformVersion '1.0.0'
 filters {
 engines {
  // include 'junit-jupiter', 'junit-vintage'
  // exclude 'custom-engine'
 }
 tags {
  // include 'fast'
  exclude 'slow'
 }
 // includeClassNamePattern '.*Test'
 }
 // enableStandardTestTask true
 // reportsDir file('build/test-results/junit-platform') // this is the default
 // logManager 'org.apache.logging.log4j.jul.LogManager'
}

如果你只需要運行JUnit 5測試,只需要導入下面兩個依賴項。JUnit Platform的依賴會自動導入。

dependencies {
 testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0")
 testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0")
}

如果你想在新平臺下運行舊的JUnit 3和4測試,需要導入下面的依賴項。

dependencies {
 testCompile("junit:junit:4.12")
 testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0")
}

編寫測試

JUnit 4測試

如果前面都配置好了,現在就可以開始編寫測試了。首先先來復習一下舊的JUnit 4測試。

public class JUnit4Test {
	@BeforeClass
	 public static void init() {
		System.out.println("Before Class");
	}
	@AfterClass
	 public static void clean() {
		System.out.println("After class");
	}
	@Before
	 public void before() {
		System.out.println("Before");
	}
	@After
	 public void after() {
		System.out.println("After");
	}
	@Test
	 public void test1() {
		System.out.println("Test 1");
	}
	@Test
	 public void test2() {
		System.out.println("Test 2");
	}
}

使用gradle test等命令執(zhí)行一下,就會執(zhí)行這個測試。結果類似于這樣。

Before Class
Before
Test 1
Test 2
After
After class

JUnit 5測試

讓我們來看看等效的JUnit 5測試怎么寫。可以看到最明顯的變化:首先幾個注解被重新命名成更見名知義的名稱;另外一點是測試方法不必是公有方法,這樣我們可以少敲幾下鍵盤。

public class JUnit5Test {
	@BeforeAll
	 static void beforeAll() {
		System.out.println("Before All");
	}
	@AfterAll
	 static void afterAll() {
		System.out.println("After All");
	}
	@BeforeEach
	 void before() {
		System.out.println("Before");
	}
	@AfterEach
	 void after() {
		System.out.println("After");
	}
	@Test
	 void test1() {
		System.out.println("Test 1");
	}
	@Test
	 void test2() {
		System.out.println("Test 2");
	}
}

編寫斷言

為了驗證測試用例是否正確,我們需要編寫一些斷言。JUnit 5自帶了很多斷言,可以幫助我們編寫測試用例。而且這些斷言都帶有可以接受lambda表達式的重載版本,非常適合Java 8使用。當然我個人認為斷言還是AssertJ更方便一點。

import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.*;

public class AssertionDemo {
 @Test
 void testAssertion() {
 assertEquals(10, 10);
 assertTrue(true);
 assertEquals(100, 100, "兩個數相等");
 assertAll("數字"
  , () -> assertEquals("name", "name")
  , () -> assertEquals(500, 500));
 assertThrows(InvalidParameterException.class
  , () -> {
   throw new InvalidParameterException();
  }
 );
 int result = assertTimeout(Duration.ofSeconds(5)
  , () -> {
   int i = 0, j = 0;
   while (i <= 100) {
   for (; j <= 100000; j++)
    j++;
   i++;
   }
   return i;
  });
 assertEquals(100, result);
 }
}

依賴注入

現在測試類的構造方法和測試方法都可以接受參數了。ParameterResolver接口定義了如何在運行時注入參數的方法。內置的幾個可以讓我們獲取測試用例運行時的信息。

首先是TestInfoParameterResolver。如果方法上有TestInfo類型的實例,JUnit 5框架就會自動注入該實例,這個實例的幾個方法可以讓我們獲取測試類和測試方法的名稱、顯示名稱、標簽等信息。

public class DependencyInjectionDemo {
 @Test
 @DisplayName("依賴注入")
 @Tag("test")
 void testDisplayName(TestInfo testInfo) {
 assertEquals("依賴注入", testInfo.getDisplayName());
 assertEquals(Collections.singleton("test"), testInfo.getTags());
 }
}

還有RepetitionInfoParameterResolver等內置參數解析器,將在后面介紹。

常用注解

顯示名稱

我們可以為測試類和測試方法添加自定義的名稱,這些名貴會由測試運行器和測試報告所顯示。顯示名稱沒有變量名那樣的顯示,可以是一段包含空格的長字符串,甚至還可以是Emoji表情。

@DisplayName("測試類可以指定顯示名稱")
public class DisplayNameDemo {
	@Test
	 @DisplayName("測試方法也可以指定顯示名稱")
	 void testWithLongDisplayName() {
	}
	@Test
	 @DisplayName("顯示名稱還可以包含表情��")
	 void testWithDisplayNameWithEmoji() {
	}
}

禁用測試

@Disabled注解可以用到測試類或測試方法上,可以禁用對應的測試。

@Disabled
public class DisabledTestDemo {
 @Test
 //@Disabled
 void testDisabled() {

 }
}

重復測試

如果需要讓某個測試方法運行多次,使用@RepeatedTest注解。

public class RepeatedTestDemo {
 @RepeatedTest(10)
 void testRepeated10Times() {

 }
}

還可以注入一個實例RepetitionInfo,檢查當前重復次數和總的重復次數。

public class RepeatedTestDemo {
	@BeforeEach
	 void beforeEach(RepetitionInfo info) {
		System.out.printf("%d - %d\n"
		    , info.getCurrentRepetition()
		    , info.getTotalRepetitions());
	}
	@RepeatedTest(10)
	 void testRepeated10Times() {
	}
}

附帶標簽

在前面介紹配置Gradle的時候就說了,在配置中可以選擇過濾某些標簽的測試。要在代碼中給標簽也很簡單,直接用@Tag注解即可。

@Tag("taggedTest")
public class TagDemo {
	@Test
	 @Tag("taggedTest1")
	 void testWithTag1() {
	}
	@Test
	 @Tag("taggedTest2")
	 void testWithTag2() {
	}
}

嵌套測試

有時候可能需要嵌套測試來表明某些測試之間的包含關系。嵌套測試使用@Nested注解。

@DisplayName("外層測試")
public class NestedDemo {
 @Test
 void testOuter() {
 }

 @Nested
 @DisplayName("內層測試")
 class InnerTestDemo {
  @Test
  void testInner() {
  }
 }
}

需要注意只有費靜態(tài)內部類才能使用Nested注解。另外,由于Java不允許內部類有靜態(tài)方法,所以也不能有@BeforeAll和@AfterAll注解。如果想要突破這個限制,需要在嵌套內部類上添加@TestInstance(Lifecycle.PER_CLASS)注解,詳情參見Test Instance Lifecycle。

IDE支持

雖然現在JUnit 5已經出來了。但是各種工具鏈的支持還沒有跟上。目前只有Intellij IDEA和Eclipse 4.7 (Oxygen)添加了對JUnit 5的支持。所以如果在正式場合的話,使用JUnit 4還是更穩(wěn)妥一點。

常見問題

區(qū)分不同版本間的@Test注解

就在我寫這篇文章的時候, 我的測試小例子就遇到了一個問題,測試通不過,顯示如下的錯誤信息。

Failures (1):
 JUnit Vintage:yitian.study.test.AssertionDemo:initializationError
 ClassSource [className = 'yitian.study.test.AssertionDemo', filePosition = null]
 => java.lang.Exception: Method testAssertion() should be public

英文好的同學應該可以認出來,這個錯誤信息說的是測試方法必須是公開的。但是前面明明說了,JUnit 5取消了這個限制,那么為什么還會出現這個錯誤呢?我仔細一看,發(fā)現了錯誤所在。可能是由于以前JUnit 4用的比較多,所以IDE默認對于@Test這個注解,自動補全的是這個。

import org.junit.Test;

這個包是JUnit 4下的@Test注解。如果我們要使用JUnit 5的話,需要的是以下這個@Test注解。

import org.junit.jupiter.api.Test;

修改之后,再次運行測試,果然沒有問題了。當然這里為了學習和使用,我同時引用了JUnit 4的包,所以才會出現這個沖突。如果沒有什么特殊需求的話,建議只導入JUnit 5的jar包,防止出現混淆。當然都導入也可以,只不過你就需要小心區(qū)分,不要把JUnit 4的注解寫到JUnit 5的測試上。最后附上我的測試小例子,有興趣的同學可以看看。

總結

以上就是本文關于JUnit5相關內容簡介的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關文章

  • SpringBoot實現連接nacos并支持多環(huán)境部署

    SpringBoot實現連接nacos并支持多環(huán)境部署

    這篇文章主要介紹了SpringBoot實現連接nacos并支持多環(huán)境部署方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Spring Data JPA 設置字段默認值方式

    Spring Data JPA 設置字段默認值方式

    這篇文章主要介紹了Spring Data JPA設置字段默認值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 如何利用JConsole觀察分析Java程序的運行并進行排錯調優(yōu)

    如何利用JConsole觀察分析Java程序的運行并進行排錯調優(yōu)

    從Java 5開始 引入了 JConsole。JConsole 是一個內置 Java 性能分析器,可以從命令行或在 GUI shell 中運行。您可以輕松地使用 JConsole(或者,它更高端的 “近親” VisualVM )來監(jiān)控 Java 應用程序性能和跟蹤 Java 中的代碼
    2015-12-12
  • Spring動態(tài)代理實現日志功能詳解

    Spring動態(tài)代理實現日志功能詳解

    這篇文章主要為大家詳細介紹了Spring動態(tài)代理實現日志功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JavaAPI中BigInteger、BigDecimal的使用方法及應用

    JavaAPI中BigInteger、BigDecimal的使用方法及應用

    這篇文章主要給大家介紹了關于JavaAPI中BigInteger、BigDecimal的使用方法及應用,BigInteger是Java中用于表示任意大小整數的類,它提供了加、減、乘、除等多種運算方法,適用于大整數處理和高精度計算場景,需要的朋友可以參考下
    2024-11-11
  • 聊聊spring @Transactional 事務無法使用的可能原因

    聊聊spring @Transactional 事務無法使用的可能原因

    這篇文章主要介紹了spring @Transactional 事務無法使用的可能原因,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Mybatis-Plus中的MetaObjectHandler組件的使用

    Mybatis-Plus中的MetaObjectHandler組件的使用

    MetaObjectHandler是Mybatis-Plus中一個實用組件,專門用于自動處理實體對象中的特定字段,如創(chuàng)建時間、更新時間、創(chuàng)建人和修改人等,該接口允許開發(fā)者在不修改業(yè)務代碼的情況下,實現自動填充功能,極大地簡化了代碼的復雜性,感興趣的可以了解一下
    2024-10-10
  • Jaxb2實現JavaBean與xml互轉的方法詳解

    Jaxb2實現JavaBean與xml互轉的方法詳解

    這篇文章主要介紹了Jaxb2實現JavaBean與xml互轉的方法,簡單介紹了JAXB的概念、功能及實現JavaBean與xml互轉的具體操作技巧,需要的朋友可以參考下
    2017-04-04
  • java使用listIterator逆序arraylist示例分享

    java使用listIterator逆序arraylist示例分享

    對于列表而言,除了Iterator,還提供了一個功能更加強大的ListIterator。它可以實現逆序遍歷列表中的元素。本示例將使用其逆序遍歷ArrayList
    2014-02-02
  • Spring AOP 自定義注解的實現代碼

    Spring AOP 自定義注解的實現代碼

    本篇文章主要介紹了Spring AOP 自定義注解的實現代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論

石景山区| 延川县| 南投市| 虞城县| 锦屏县| 涞水县| 吉木萨尔县| 昂仁县| 中卫市| 陆良县| 辰溪县| 霍邱县| 河间市| 密山市| 化德县| 宁陕县| 邵阳县| 天长市| 油尖旺区| 永仁县| 马公市| 旺苍县| 江西省| 杂多县| 修水县| 繁昌县| 宝山区| 简阳市| 河津市| 炎陵县| 杂多县| 卢湾区| 喜德县| 平陆县| 宜黄县| 宜君县| 怀仁县| 巢湖市| 新乡县| 苏尼特右旗| 绥江县|