Junit5預覽

huangl998 8年前發布 | 37K 次閱讀 JUnit 單元測試

來自: http://iamlbk.github.io/blog/20160313/junit5-preview/

junit是最常用的java單元測試框架之一. 目前junit5已經推出了5.0.0 Alpha版, 那么junit5相對于junit4有什么變化呢? 有什么新特性呢? 在這里我們聊一下junit5的變化和新特性.

概述

junit 5主頁

在介紹junit 5的新特性之前先給出幾個鏈接. 有興趣的朋友可以去看看:

Java版本

junit 5只支持java 8及以上. 按照《junit 5用戶指南》的說法, junit 5也可以測試低版本jdk編譯的java類.

Maven坐標

junit 5已經不再是單個庫了, 而是模塊化結構的集合. 所有的模塊可以參見《junit 5用戶指南》. 這里我們給出一般情況下需要依賴的junit 5的包的Maven坐標:

Group ID: org.junit

Artifact ID: junit5-api

Version: 5.0.0-SNAPSHOT

包/類變化

  • 注解移動到了 org.junit.gen5.api 包中
  • 斷言移動到了 org.junit.gen5.api.Assertions 類中
  • 假設移動到了 org.junit.gen5.api.Assumptions 類中

注解變化

  • @Test 注解已經不再包含任何的屬性了.
  • @Before 和 @After 已經刪除了, 與之對應的替代注解分別是 @BeforeEach 和 @AfterEach
  • @BeforeClass 和 @AfterClass 也不存在了, 可以使用 @BeforeAll 和 @AfterAll 代替
  • @Ignore 被 @Disabled 代替
  • @Category 使用 @Tag 代替
  • @RunWith 使用 @ExtendWith 代替
  • 更多的信息請參見《junit 5用戶指南》

第一個測試方法

下面我們用junit 5編寫一個最簡單的單元測試:

Junit5FirstTest.java
class Junit5FirstTest{  @Test  void myFirstTest() {  assertEquals(2, 1 + 1);  } } 

</div>

注意到了嗎? 我們的測試類和方法都沒有用 public 修飾. 在junit 5中只要測試方法沒有用 private 修飾就可以.

Lambda表達式

由于junit 5需要的jre版本為java 8. 自然就可以在特定地方使用Lambda表達式. 這里我們在斷言中使用一次Lambda表達式:

Junit5FirstTest.java
@Test void testLambda(){  assertTrue(1 == 1, () -> "1竟然不等于1..."); } 

</div>

我們可以看一下 assertTrue 方法的簽名就清楚是怎么回事了:

public static void assertTrue(boolean condition)  // 我們調用的是下面的方法 public static void assertTrue(boolean condition, Supplier<String> messageSupplier)  public static void assertTrue(BooleanSupplier booleanSupplier)  public static void assertTrue(BooleanSupplier booleanSupplier, String message)  public static void assertTrue(boolean condition, String message)  public static void assertTrue(BooleanSupplier booleanSupplier, Supplier<String> messageSupplier) 

</div>

注: 其中的 Supplier 和 BooleanSupplier 都在 java.util.function 包中, 是java 8引入的接口. 這兩個接口都是函數式接口, 所以可以使用Lambda表達式簡化調用.

斷言分組

斷言分組可以執行一組短信, 之后一起報告. 這樣我們或許可以省掉不少的錯誤信息字符串.

@Test void testGroup(){  int[] array = {1, 2};  assertAll("分組測試失敗",  () -> assertTrue(array.length == 2),  () -> assertTrue(array[0] == 1),  () -> assertTrue(array[1] == 2)); } 

</div>

異常斷言

在junit 4中如果想要判斷異常, 就需要在 @Test 注解中添加expected屬性或者使用try-catch包裹. 但是try-catch太繁瑣, 而有時候第一種方法又不是很合適. 在Junit 5可以使用異常斷言解決:

@Test void testException(){  assertThrows(Exception.class, () -> {  throw new NullPointerException();  }); } 

</div>

假設、標簽以及禁用測試

在Junit 5中假設使用 org.junit.gen5.api.Assumptions 類中的方法完成, 如果假設的條件沒有滿足, 那么就會跳過測試方法. @Tag 注解用來對測試分組, 之后可以方便的指定需要執行那個分組的測試方法. 禁用測試使用 @Disabled 注解實現, 被該注解標注的方法/類將直接跳過執行.

@Test void testAssumption() {  assumeTrue(System.getenv("OS").startsWith("Windows"), "跳過測試");  // 只有在Windows下才會執行下面的代碼  // 在其他平臺下將會跳過該方法, 也不會報錯 }  @Test @Tag("tag1") void testTag() { }  @Test @Disabled void testWillBeSkipped() { } 

</div>

其他

  • 擴展模型: junit 5修改了擴展模型, 新的擴展模型允許類上注冊多種擴展.
  • 嵌套測試: junit 5中允許在一個測試類中創建一個內部測試類
  • 方法參數: junit 5中測試方法可以擁有特定類型的參數, junit將進行依賴注入.

junit 5的還有一些有趣的新特性, 這里限于篇幅就不再說了, 感興趣的朋友可以參見《junit 5用戶指南》.

</div>

 本文由用戶 huangl998 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!