Junit5系列-Junit5中Assumptions假設類

yoylee_web發表於2019-01-09

系列導航

點選跳轉到系列博文目錄導航

簡介

在Junit5中的JUnit Jupiter模組附帶了JUnit 4提供的假設方法的一個子集,並新增了一些非常適合與Java 8 lambdas一起使用的方法。 所有JUnit Jupiter假設測試方法都是org.junit.jupiter.api.Assumptions類中的靜態方法。

Assumptions類顧名思義是假設的意思也就是做一些假設,只有當假設成功後才會執行接下來的程式碼。說的再詳細不如實踐,下面看一下案例。

使用Assumptions類中的假設方法時,當假設不成立時會報錯,但是測試會顯示被ignore忽略執行。也就是當我們一個類中有多個測試方法時,其中一個假設測試方法假設失敗,其他的測試方法全部成功,那麼該測試類也會顯示測試成功!
這說明假設方法適用於:在不影響測試是否成功的結果的情況下根據不同情況執行相關程式碼!

可以看下面一個案例:
在這裡插入圖片描述

案例解析

其中每個方法的作用程式碼中的註釋寫的已經非常清楚了,就不再贅述了.

大家最好將程式碼自己測試一遍,可以加深理解與記憶!

案例程式碼:

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;
import org.junit.jupiter.api.Test;

/**
 * @author liyangyang
 * @date 2019/1/8
 */
class AssumptionsDemo {
    @Test
    void testAssumTrue() {
        System.out.println("test");
        //assumeTrue該語句並不會影響其前面的語句執行
        //可以將3>5改成3<5自行測試成功的效果
        assumeTrue(3>5);
        //該方法中下面所有的程式碼變為在上面假設的條件成立後執行
        // 如果上述假設不成立,則會忽略執行該行下面的程式碼,並報錯
        System.out.println("assume is true!");
    }

    @Test
    void testAssumTrueMessage() {
        assumeTrue(3<5,
                //第二個引數為當第一個引數不成立時,輸出的自定義錯誤資訊
                () -> "Aborting test: not on developer workstation");
        //下面的程式碼變為在上面假設的條件成立後執行
        System.out.println("assume is true!");
    }
    
    @Test
    void testAssumeTrueLambda(){
        //這個方法的第一個引數為函式式介面,通過看起原始碼可以發現無引數,返回值為boolean
        assumeTrue(()->{
            System.out.println("in assumeTrue");
//            boolean flag = true;
            boolean flag = false;
            return flag;
        });
        System.out.println("out assumeTrue");
    }

    @Test
    void testAssumFalse(){
        //同assumTrue效果相反
        assumeFalse(3>5);
        System.out.println("assume is true!");
    }

    @Test
    void testAssumFalseMessage(){
        //同assumTrue效果相反
        assumeFalse(3<5,
                () -> "Aborting test: not on developer workstation");
        System.out.println("assume is true!");
    }

    @Test
    void testAssumThat() {
        assumingThat(3>5,
                () -> {
                    //與上述方法不同的是,僅當前面假設成立時,才會執行這裡面的語句!!!!
                    // 且只會影響到該lambda表示式中的程式碼
                    assertEquals(2, 2);
                });
        //此處的斷言不受上述assumingThat限制,在所有情況下都會執行
        System.out.println("no effect");
        assertEquals("a string", "a string");
    }
}

通過上述的案例,相信大家已經瞭解了Assumptions類的使用方法,下面我們來分析一下這個類。

原始碼分析

首先,我們看一下Assumptions類都有什麼方法。
在這裡插入圖片描述
從圖片中可以看到主要有5種方法:

  • 構造方法
  • 靜態共有assumeFalse系列過載方法
  • 靜態共有assumeTrue系列過載方法
  • 靜態共有assumeThat系列過載方法
  • 靜態私有throwTestAbortedException方法

其中的過載方法以assumeFalse為例說一下:

  • assumeFalse(boolean assumption) : 一個boolean型別引數假設表示式。
  • assumeFalse(BooleanSupplier assumptionSupplier) : 函式式介面引數BooleanSupplier無參一個boolean返回值,使用lambda表示式即可,上述案列中也有涉及此類方法的使用
  • assumeFalse(boolean assumption, String message) : 第一個引數假設表示式,第二個引數假設失敗時自定義輸出
  • assumeFalse(boolean assumption, Supplier
    messageSupplier) : 效果和assumeFalse(boolean assumption, String message)類似,只是將第二個自定義輸出改成了函式式介面,可以使用lambda表示式,更加靈活。

ps:如果不知道什麼是函式式介面或者lambda表示式,可以參考此博文:https://segmentfault.com/blog/yinhaonefu_java8

其中的作用在上述的案例分析中已經說明的很清楚了,接下來我們看一下其中的兩個代表方法assumeTrue和assumeThat的原始碼是怎樣的。

1.assumeTrue(boolean assumption, String message)原始碼:

public static void assumeTrue(boolean assumption, String message) throws TestAbortedException {
        if (!assumption) {
            //呼叫方法
            throwTestAbortedException(message);
        }

}
//被呼叫方法
private static void throwTestAbortedException(String message) {
        throw new TestAbortedException(StringUtils.isNotBlank(message) ? "Assumption failed: " + message : "Assumption failed");
}

從上述可以看到其程式碼過程為:

  1. 判斷引數assumption是否為true,為true則成功執行
  2. 如果不為true,則呼叫throwTestAbortedException方法丟擲一個自定義異常TestAbortedException

2.assumingThat(boolean assumption, Executable executable)方法原始碼分析:

public static void assumingThat(boolean assumption, Executable executable) {
        if (assumption) {
            try {
                executable.execute();
            } catch (Throwable var3) {
                ExceptionUtils.throwAsUncheckedException(var3);
            }
        }
}

從原始碼中就可以看出,只有當引數assumption為true時才會執行(executable.execute())第二個引數lambda表示式中的內容, 看一下第二個引數Executable的原始碼:

@FunctionalInterface
@API(
    status = Status.STABLE,
    since = "5.0"
)
public interface Executable {
    void execute() throws Throwable;
}

可以看到這裡的Executable還是一個函式式介面(@FunctionalInterface),無參無返回值。只有一個execute()。

好了,到這裡大家應該對Assumptions假設類有個全面的瞭解了,如果還是有疑問,可以自行根據原始碼並對照本部落格進行理解。

如果轉載此博文,請附上本文連結,謝謝合作~:https://blog.csdn.net/csdn___lyy

如果感覺這篇文章對您有所幫助,請點選一下“喜歡”或者“關注”博主,您的喜歡和關注將是我前進的最大動力!

refer: 官網

相關文章